<int-jms:outbound-gateway>未收到回复消息</int-jms:outbound-gateway>

时间:2014-07-15 15:03:15

标签: spring-integration

我的<int-jms:outbound-gateway>没有向目标队列发送消息,因此我最终得到了MessageTimeoutException。

我尝试过哪种功能完美并发送了消息,确保我在请求频道上收到正确的消息。

另外我在日志中看到我的出站gatway正在requestCh1上接收消息。 org.springframework.integration.jms.JmsOutboundGateway#0收到消息:[Payload ...]

我真的被困住了,无法弄清楚为什么jms出站网关没有向目的队列发送消息。

任何帮助?

配置:

<int:publish-subscribe-channel id="requestCh1" />

<int:service-activator input-channel="requestCh1" ref="processor" method="processMsg"/>
<bean id="processor" class="com.processor.ProcessorImpl" />

<int-jms:outbound-gateway 
            id="eventPublisherGateway"
            connection-factory="myConnectionFactory"
            request-channel="requestCh1"
            request-destination="qequestQueue"
            reply-channel="responseCh1" 
            reply-destination="responseQueue" 
            receive-timeout="20000">
</int-jms:outbound-gateway>

堆栈跟踪:

07-15-2014 13:18:49 [threaPool.Thread-1] DEBUG AbstractMessageChannel$ChannelInterceptorList.preSend(334) | preSend on channel 'errorChannel', message: [Payload MessageTimeoutException content=org.springframework.integration.MessageTimeoutException: failed to receive JMS response within timeout of: 20000ms][Headers={id=7c81f473-e60e-30fa-b031-8106b3a2fff0, timestamp=1405444729344}]
07-15-2014 13:18:49 [threaPool.Thread-1] DEBUG AbstractMessageHandler.handleMessage(72) | (inner bean)#3dd4a538 received message: [Payload MessageTimeoutException content=org.springframework.integration.MessageTimeoutException: failed to receive JMS response within timeout of: 20000ms][Headers={id=7c81f473-e60e-30fa-b031-8106b3a2fff0, timestamp=1405444729344}]
07-15-2014 13:18:49 [threaPool.Thread-1] ERROR LoggingHandler.handleMessageInternal(145) | org.springframework.integration.MessageTimeoutException: failed to receive JMS response within timeout of: 20000ms
    at org.springframework.integration.jms.JmsOutboundGateway.handleRequestMessage(JmsOutboundGateway.java:667)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:170)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
    at org.springframework.integration.dispatcher.BroadcastingDispatcher.invokeHandler(BroadcastingDispatcher.java:160)
    at org.springframework.integration.dispatcher.BroadcastingDispatcher.dispatch(BroadcastingDispatcher.java:142)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:255)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:223)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:109)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:44)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:94)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.sendMessage(AbstractReplyProducingMessageHandler.java:260)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.sendReplyMessage(AbstractReplyProducingMessageHandler.java:241)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.produceReply(AbstractReplyProducingMessageHandler.java:205)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleResult(AbstractReplyProducingMessageHandler.java:199)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:177)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
    at org.springframework.integration.endpoint.PollingConsumer.handleMessage(PollingConsumer.java:74)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:205)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.access$000(AbstractPollingEndpoint.java:55)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:149)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:146)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:284)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:52)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

添加JMS消息此网关正在发送相关ID。

JMS Message class:jms_text

JMSType:         null
  JMSDeliveryMode: 2
  JMSExpiration:   0
  JMSPriority:     4
  JMSMessageID:    ID:414d5120414344534430513720202020537502dd201b6c02
  JMSTimestamp:    1405462485258
  JMSCorrelationID:bf566441-8ccb-4620-afac-941cc4842a61
  JMSDestination:  queue://QMGR01/REQUESTQ
  JMSReplyTo:      queue://QMGR01/RESPONSEQ
  JMSRedelivered:  false
  JMSXDeliveryCount:0
  JMSXAppID:Websphere MQ Client for Java
  JMS_IBM_PutApplType:28
  timestamp:1405462384810
  sequenceNumber:3
  JMSXUserID:mqcls1      
  sequenceSize:4
  JMS_IBM_PutTime:22574883
  JMS_IBM_PutDate:20140715
<?xml version="1.0" encoding="UTF-8" standalone="no"?><Employee><empId>567</empId></<Employee>

1 个答案:

答案 0 :(得分:0)

既然您说MessageTimeoutException并且JmsOutboundGateway中只有一个地方:{/ p>

if (jmsReply == null) {
    if (this.requiresReply) {
        throw new MessageTimeoutException(message,
                "failed to receive JMS response within timeout of: " + this.receiveTimeout + "ms");
    }
    else {
        return null;
    }
}

因此,您的问题围绕reply无请求。 我的意思是您正确地将邮件发送到目的地,但是另一方没有向您发送回复responseQueue目的地。

如果您对request/reply方案不感兴趣并且它足以发送消息,您可以切换到<int-jms:outbound-channel-adapter>

如果不是真的,请显示StackTrace以查看MessageTimeoutException的原因。

<强>更新

  

这可能是因为JmsCorrelationId?

是的,它可以。另一部分必须使用JMSCorrelationID中的值来支持request属性。

JmsOutboundGateway通过selector进行相关:

messageSelector = "JMSCorrelationID = '" + correlationId + "'";
...
messageConsumer = session.createConsumer(replyTo, messageSelector);