我在我们的应用程序中使用了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
答案 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
相关