Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring integration 如何使用transform创建集成流?_Spring Integration_Spring Cloud Stream_Spring Cloud Dataflow - Fatal编程技术网

Spring integration 如何使用transform创建集成流?

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

我想从数据库中获取记录并将其转换为json。这在Spring云数据流上运行

我怀疑我错过了一些关于集成流的电话

错误输出为:

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();
}

您缺少几点:

  • Spring集成中的
    transform()
    确实需要一个输出通道或回复通道头。在Spring集成中,根本无法绕过端点之间的通道。即使在JDBC和transform之间的流中没有请求它,框架也会提供它。由于在流的末尾调用了
    get()
    ,并且没有提供任何通道将转换结果发送到的提示,因此会抛出这样一个
    DestinationResolutionException

  • Spring Cloud Stream功能模型处理基本Java接口—
    供应商
    功能
    消费者
    。将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注释?