2017-06-14 55 views
1

我在异步模式下使用弹簧集成类JmsOutboundGateway。来自文档:使用JmsOutboundGateway异步模式与MessageId,而不是CorrelationID

异步需要一个<reply-listener/>它还需要指定一个correlationKey(通常为JMSCorrelationID)。如果这些条件中的任何一个不满足,则会忽略异步。

但是,接收我的请求并发送响应的系统将JMSMessageId从请求消息写入JMSCorrelationID作为响应。如果将由JmsOutboundGateway JMSCorrelationID生成的副本生成到JMSMessageId,我可以解决此问题。我怎样才能做到这一点的弹簧集成(春季版集成的JMS 4.3.6.RELEASE)

<int-jms:outbound-gateway id="requestGateway" 
          connection-factory="jndiConnectionFactory" 

          request-destination="queueInput" 
          request-channel="channel.request.message" 

          reply-destination="queueOutput" 
          reply-channel="channel.response.message" 

          correlation-key="JMSCorrelationID" 
          async="true"> 
    <int-jms:reply-listener max-concurrent-consumers=20 
          concurrent-consumers="10" /> 
    </int-jms:outbound-gateway> 

回答

0

这是一个电流限制,使用相关的这种风格是不是与异步兼容,只有阻塞发送/接收。

问题是我们收到消息ID之前可能会收到回复,因此我们不知道如何关联它。

我只是简单地看了一下代码,我认为如果您想open an 'Improvement' JIRA Issue我们来看看会不会太难。

+0

JMS 2.0中有一个新的API:'send(Message message,CompletionListener completionListener)'。我们可以在TX被提交给容器中的异步回复之前,依靠'CompletionListener'回调。奥尔加,你的客户应该考虑如果不是空的话,不要覆盖'JMSCorrelationID'。 –

+0

您的客户端应该考虑如果JMSCorrelationID不为空,则不要覆盖JMSCorrelationID - 您的意思是应用程序为我的请求发送响应? –