Spring JMS出站网关接收超时被忽略

时间:2014-11-06 14:11:25

标签: spring-integration spring-jms

我有一个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

我的IntegrationgConfig.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是否可能正在处理异常而不将其传回流中?

1 个答案:

答案 0 :(得分:1)

要使其正常运行,您需要使用.handle()将第二个Lambda添加到Jms

.handle(Jms.outboundGateway(connectionFactory)
                .receiveTimeout(45000)
                .requestDestination("REQUEST_QUEUE")
                .replyDestination("RESPONSE_QUEUE")
                .correlationKey("JMSCorrelationID"),
        e -> e.requiresReply(true))

默认AbstractReplyProducingMessageHandler即使reply用尽也不需要receiveTimeout,我们会根据您显示的日志查看。

但是,我发现我们应该修改所有MessageHandlerSpec,因为默认情况下,XML支持会将某些组件的requires-reply更改为true

随意提出问题的JIRA issue,我们很快就会解决这个问题,因为Java DSL的GA版本计划在一到两周内完成:https://spring.io/blog/2014/10/31/spring-integration-java-dsl-1-0-rc1-released

感谢您对此事的关注!