1

我正在尝试配置如下流(直接从 jdbc 源管道到 jdbc 接收器)

xd> 流创建 test2 --definition "输出:jdbc --split=true --username=test --password=test --driverClassName=com.mysql.jdbc.Driver --url=jdbc:mysql://dbhost: 3306/test --query='select id,name from test' | 输入:jdbc --username=test --password=test --driverClassName=com.mysql.jdbc.Driver --tableName=test2 --columns=id ,name --url=jdbc:mysql://dbhost:3306/test" --deploy

但发生ClassCastException。

引起:java.lang.ClassCastException:org.springframework.util.LinkedCaseInsensitiveMap 不能在 org.springframework.xd.jdbc.JdbcMessagePayloadTransformer.transformPayload(JdbcMessagePayloadTransformer.java:39) 的 org.springframework.integration 中转换为 java.lang.String .transformer.AbstractPayloadTransformer.doTransform(AbstractPayloadTransformer.java:33) 在 org.springframework.integration.transformer.AbstractTransformer.transform(AbstractTransformer.java:33) ... 147 更多

MySQL 连接和表模式似乎配置正确。连通性已经确认。

CREATE TABLE 测试 (id int, name varchar(20)); CREATE TABLE test2 (id int, name varchar(20))

Spring XD 版本是 1.1.0.BUILD-20141103.163150-1-dist 来自下面的 zip。

http://repo.spring.io/libs-snapshot/org/springframework/xd/spring-xd/1.1.0.BUILD-SNAPSHOT/spring-xd-1.1.0.BUILD-20141103.163150-1-dist.zip

我想将有效负载数据存储到目标接收器表,但该功能仍处于试验阶段吗?
或者,是流问题吗,例如只是进行某种转换?

4

2 回答 2

3

就像 Gary 说的那样,接收器需要一个 JSON 文档(有一个出色的 JIRA 票可以改进接收器以接受地图)。现在,您可以使用 --outputType=application/json 让源生成 JSON 文档而不是 Map。这是我刚试过的一个例子:

stream create jdbcCp --definition "source:jdbc --query='select id,name,year from myfiles where status = 0' --maxRowsPerPoll=10 --update='update myfiles set status = 1 where id in (:id)' --outputType=application/json | sink:jdbc --tableName=newfiles --columns=id,name,year"  --deploy

JIRA 问题是https://jira.spring.io/browse/XD-2250

于 2014-11-05T17:49:36.970 回答
1

请参阅文档- 接收器需要一个简单的 String 有效负载或一个 JSON 字符串,它将被转换为Map. 源产生 a Listof Maps(或单个Maps 时split为真)。

目前,sink 没有直接处理 Map 的选项;您可以添加一个transform模块以将其转换Map为 JSON 或创建一个自定义接收器。

我们可能应该将接收器更改为接受Map.

于 2014-11-05T13:43:00.810 回答