我有一个Spring Integration流,它通过JMS出站网关发送消息,该网关配置为接收超时45秒。我试图通过在设置中发送一条消息来测试接收超时时间,在该设置中,消息从未在另一端被消耗(因此不会返回响应)。但是,当我运行测试时,消息被放置在出站队列中,但出站网关的接收超时从未发生(45秒后)。你知道发生(不发生)这种事的原因是什么吗?
我的堆栈是:
o.s.i:spring-integration-java-dsl:1.0.0.M3
o.s.i:spring-integration-jms:4.0.4.RELEASE
我的IntegrationConfig.class:
@Configuration
@EnableIntegration
public class IntegrationConfig {
...
@Bean
public IntegrationFlow testFlow() {
return IntegrationFlows
.from("test.request.ch")
.handle(Jms.outboundGateway(connectionFactory)
.receiveTimeout(45000)
.requestDestination("REQUEST_QUEUE")
.replyDestination("RESPONSE_QUEUE")
.correlationKey("JMSCorrelationID"))
.handle("testService",
"testMethod")
.channel("test.response.ch").get();
}
...
}
就JMS配置而言,使用的连接工厂是一个标准的CachingConnectionFactory,它以MQConnectionFactory为目标。
提前感谢您在这方面的帮助。PM
---更新---
我已经打开了调试,我可以看到当超时发生时,会记录以下消息:
AbstractReplyProducingMessageHandler - handler 'org.springframework.integration.jms.JmsOutboundGateway#0' produced no reply for request Message: [Payload byte[835]][...]
只需要了解如何在流程中捕获此事件?
---更新2-
正在发送的消息上设置了ERROR_CHANNEL标头,我希望将超时异常路由到该标头,但这种路由不会发生?
CachingConnectionFactory是否可能正在处理异常而不将其传递回流?
要使其工作,您需要使用Jms
:将第二个Lambda添加到.handle()
.handle(Jms.outboundGateway(connectionFactory)
.receiveTimeout(45000)
.requestDestination("REQUEST_QUEUE")
.replyDestination("RESPONSE_QUEUE")
.correlationKey("JMSCorrelationID"),
e -> e.requiresReply(true))
默认情况下,即使receiveTimeout
耗尽,AbstractReplyProducingMessageHandler
也不需要reply
,我们可以从您显示的日志中看到这一点。
但是,我认为我们应该修改所有的MessageHandlerSpec
,因为XML支持默认情况下会将某些组件的requires-reply
更改为true
。
请随时就此事提出JIRA问题,我们很快就会解决,因为Java DSL的GA
版本计划在一两周内发布:https://spring.io/blog/2014/10/31/spring-integration-java-dsl-1-0-rc1-released
谢谢你对这些东西的关注!