升级到1.1.3 spring integration java dsl

时间:2016-08-04 11:02:21

标签: java spring spring-integration dsl

我在我们的应用程序中使用了spring集成。最近,我们尝试将项目升级到使用spring boot 1.4 release的{​​{1}}。在最新版本中,他们已弃用spring java dsl 1.1.3并创建了一个名为messageDriverChannelAdapter的新方法,即' r'固定的。

使用java dsl 1.1.1的messageDriverChannelAdapter时,集成流工作正常,但在故障情况下它在1.1.3中失败(即流程中发生异常)。

这是我的流程

messageDriverChannelAdapter

我甚至尝试过路由

IntegrationFlows
                .from(Jms.messageDriverChannelAdapter(listenerContainer()).errorChannel(errorChannel())
                        .outputChannel(listenerDirectChannel()))
                .channel(listenerDirectChannel()).transform(new JsonToChangeObjectTransformer())
                .channel(conversionOutChannel()).handle(CHANGED_OBJECT_LISTENER_IMPL, PROCESS_MESSAGE)
                .channel(errorChannel()).handle(FAILED_MESSAGE_HANDLER_IMPL, HANDLE_ERROR).get();

但仍然没有运气

我的观察是消息从未传递到错误通道(因为我已经调试过)并且它一直试图在通道中放置消息,最终导致IntegrationFlows .from(Jms.messageDrivenChannelAdapter(listenerContainer()) .errorChannel(errorChannel()) .outputChannel(listenerDirectChannel())) .channel(listenerDirectChannel()) .transform(new JsonToChangeObjectTransformer()) .<Object, Boolean> route(p -> p instanceof ChangedObject, m -> m.channelMapping("true", "conversionOutChannel").channelMapping("false", "errorChannel")) .channel(conversionOutChannel()) .handle(CHANGED_OBJECT_LISTENER_IMPL, PROCESS_MESSAGE).channel(errorChannel()) .handle(FAILED_MESSAGE_HANDLER_IMPL, HANDLE_ERROR).get();

例外:

stackoverflowerror

1 个答案:

答案 0 :(得分:2)

IntegrarionFlow定义不正确。 指定时

.handle(CHANGED_OBJECT_LISTENER_IMPL, PROCESS_MESSAGE)
.channel(errorChannel())
.handle(FAILED_MESSAGE_HANDLER_IMPL, HANDLE_ERROR)

这意味着第一个.handle()的输出将发送到errorChannel。 错误过程的结果很好。不好......

不确定这是你所期望的。

尝试分离错误流。例如:

@Bean
    public IntegrationFlow jmsMessageDrivenRedeliveryFlow() {
        return IntegrationFlows
                .from(Jms.messageDrivenChannelAdapter(this.jmsConnectionFactory)
                        .errorChannel(IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)
                        .destination("jmsMessageDriverRedelivery"))
                .<String, String>transform(p -> {
                    throw new RuntimeException("intentional");
                })
                .get();
    }

    @Bean
    public CountDownLatch redeliveryLatch() {
        return new CountDownLatch(3);
    }

    @Bean
    public IntegrationFlow errorHandlingFlow() {
        return IntegrationFlows.from(IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)
                .handle(m -> {
                    MessagingException exception = (MessagingException) m.getPayload();
                    redeliveryLatch().countDown();
                    throw exception;
                })
                .get();
    }

https://github.com/spring-projects/spring-integration-java-dsl/issues/101

相关