Spring integration 如何使用transform创建集成流?
我想从数据库中获取记录并将其转换为json。这在Spring云数据流上运行 我怀疑我错过了一些关于集成流的电话 错误输出为:Spring integration 如何使用transform创建集成流?,spring-integration,spring-cloud-stream,spring-cloud-dataflow,Spring Integration,Spring Cloud Stream,Spring Cloud Dataflow,我想从数据库中获取记录并将其转换为json。这在Spring云数据流上运行 我怀疑我错过了一些关于集成流的电话 错误输出为: Caused by: org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available at org.springframework.integration.handler.AbstractMes
Caused by: org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:440)
at org.springframework.integration.handler.AbstractMessageProducingHandler.doProduceOutput(AbstractMessageProducingHandler.java:319)
at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:267)
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:231)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:140)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:62)
@Bean
public MessageSource<Object> jdbcMessageSource() {
String query = "select cd_int_controle, de_tabela from int_controle rowlock readpast " +
"where id_status = 0 order by cd_int_controle";
JdbcPollingChannelAdapter adapter =
new JdbcPollingChannelAdapter(dataSource, query);
adapter.setMaxRows(properties.getPollSize());
adapter.setUpdatePerRow(true);
adapter.setRowMapper((RowMapper<IntControle>) (rs, i) -> new IntControle(rs.getLong(1), rs.getString(2)));
adapter.setUpdateSql("update int_controle set id_status = 1 where cd_int_controle = :cdIntControle");
return adapter;
}
@Bean
public IntegrationFlow jsonSupplier() {
return IntegrationFlows.from(jdbcMessageSource(),
c -> c.poller(Pollers.fixedRate(properties.getPollRateMs(), TimeUnit.MILLISECONDS).transactional()))
.transform((GenericTransformer<List<IntControle>, String>) ints -> {
//transform to Json
})
.get();
}
原因:org.springframework.messaging.core.DestinationResolutionException:没有可用的输出通道或replyChannel标头
位于org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:440)
位于org.springframework.integration.handler.AbstractMessageProducingHandler.doProduceOutput(AbstractMessageProducingHandler.java:319)
位于org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:267)
位于org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:231)
位于org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:140)
位于org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:62)
@豆子
public MessageSource jdbcMessageSource(){
String query=“从int\U controle rowlock readpast中选择cd\U int\U controle、de\U tabela”+
“其中id_status=0由cd_int_controle订购”;
JdbcPollingChannelAdapter适配器=
新的JdbcPollingChannelAdapter(数据源、查询);
setMaxRows(properties.getPollSize());
adapter.setUpdatePerRow(true);
setRowMapper((RowMapper)(rs,i)->新的IntControle(rs.getLong(1),rs.getString(2));
setUpdateSql(“更新int_controle set id_status=1,其中cd_int_controle=:cdIntControle”);
返回适配器;
}
@豆子
公共集成流jsonSupplier(){
返回IntegrationFlows.from(jdbcMessageSource(),
c->c.poller(Pollers.fixedRate(properties.getPollRateMs(),TimeUnit.millides).transactional())
.transform((通用变压器)输入->{
//转换为Json
})
.get();
}
您缺少几点:
transform()
确实需要一个输出通道或回复通道头。在Spring集成中,根本无法绕过端点之间的通道。即使在JDBC和transform之间的流中没有请求它,框架也会提供它。由于在流的末尾调用了get()
,并且没有提供任何通道将转换结果发送到的提示,因此会抛出这样一个DestinationResolutionException
供应商
,功能
,消费者
。将bean调用为jsonSupplier
并不能使其成为供应商
。您确实需要告诉框架使用什么bean进行绑定。有关更多信息,请参阅文档:
IntegrationFlow
和Supplier
声明之间的连接点。也许这一款适合你:
@Bean
PollableChannel jsonChannel() {
return new QueueChannel();
}
...
.transform((GenericTransformer<List<IntControle>, String>) ints -> {
//transform to Json
})
.channel(jsonChannel())
.get();
...
@Bean
public Supplier<Message<?>> jsonSupplier() {
return jsonChannel()::receive;
}
@Bean
PollableChannel jsonChannel()的{
返回新的队列通道();
}
...
.transform((通用变压器)输入->{
//转换为Json
})
.channel(jsonChannel())
.get();
...
@豆子
公共供应商在您的指导下,我成功地使IntegrationFlow工作,但现在从未调用供应商函数。我的配置中有spring.cloud.stream.function.bindings.jsonSupplier-out-0=output
和spring.cloud.function.definition=jsonSupplier
。您有绑定依赖关系吗?可能Spring Cloud Stream没有启动,因为您的项目中没有活页夹依赖项…org.springframework.Cloud Spring Cloud Stream活页夹kafka
OK。您是否调试了它以确保未调用您的供应商?有没有机会与我们分享一个简单的源代码应用程序项目,让我们重现一个问题?jsonSupplier是否需要用@PollableBean注释?