2014-11-06 3 views
1

У меня есть поток интеграции Spring, который отправляет сообщение через JMS Outbound Gateway, который настроен на получение тайм-аута приема 45 секунд. Я пытаюсь проверить время ожидания приема, отправив сообщение в настройке, где сообщение никогда не потребляется с другой стороны (поэтому ответ не возвращается). Однако, когда я запускаю тест, сообщение помещается в исходящую очередь, но время ожидания исходящего шлюза никогда не возникает (через 45 секунд). Любые идеи, какие причины могут быть для этого события (не происходит)?Spring JMS Outbound Gateway получает тайм-аут, игнорируемый

Мой стек:

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

--- UPDATE ---

Я включил отладку, и я могу видеть, что, когда происходит таймаут регистрируется следующее сообщение:

AbstractReplyProducingMessageHandler - handler 'org.springframework.integration.jms.JmsOutboundGateway#0' produced no reply for request Message: [Payload byte[835]][...] 

Просто нужно выяснить, как захватить это событие в потоке?

--- UPDATE 2 ---

сообщение посылается из имеет заголовок ERROR_CHANNEL установить на нем, к которому я ожидал бы исключение тайм-аут, чтобы быть направлены - но это маршрутизация не происходит?

Возможно ли, что CachingConnectionFactory обрабатывает исключение и не передает его обратно в поток?

ответ

1

Для того, чтобы его работы вам необходимо добавить второй лямбда к .handle() с 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 по этому вопросу, и мы будем решать его в ближайшее время, так как выпуск GA для Java DSL планируется в течение недели или двух: https://spring.io/blog/2014/10/31/spring-integration-java-dsl-1-0-rc1-released

Благодарим Вас за внимание к этой вещи!

+0

Привет @Artem, это хорошо работает. Я попрошу JIRA поднять. Благодаря! –