来自原始jmsReplyTo的jms动态目标

时间:2015-07-17 18:23:49

标签: spring asynchronous spring-integration spring-jms

有一个请求队列,回复队列由客户端服务器实例创建,并固定到每个实例,而不是使用临时队列。

用例需要获取入站jms消息,然后将该消息发送到异步进程。一旦从服务收到异步回复消息,我需要获取这些结果并回复原始消息的jmsReplyTo。 Jms网关在此实例中不起作用AFAIK>

我正在使用jms消息驱动的通道适配器为消息提供一系列通道和服务激活器来处理进程外调用和异步回复。我试图使用DynamicDestinationResolver无济于事。另外,我试图以编程方式设置出站目标地址,但无法找到一个好方法。

这似乎是一种常见的模式,但我找不到一个完全断开的异步请求响应的好例子。断开连接意味着通常的异步jms请求回复似乎不符合需要。

上下文配置:

<!-- Input from Amq -->

<amq:queue id="requestQueue" physicalName="${request.queue}" />

<int-jms:message-driven-channel-adapter id="jmsIn"
                                    connection-factory="jmsConnectionFactory"
                                    destination="requestQueue"
                                    channel="queueRequestChannel" concurrent-consumers="5" />

<int:channel id="queueRequestChannel" />

<int:service-activator input-channel="queueRequestChannel" ref="switchMessageHandler" method="processSwitchMessage"
        output-channel="cardNetworkOutChannel"/>

<!-- Output to Card Network-->
<int:channel id="cardNetworkOutChannel" />

<!--<int:service-activator input-channel="cardNetworkOutChannel" ref="cardNetworkHandler" method="send8583Message" />-->

<!-- Simply used to mock the card network by transforming a SwithMessage to a SwitchMessageResponse * Not needed for target solution -->
<int:transformer id="requestResponseTransformer" ref="nettyCardNetworkClientMock" input-channel="cardNetworkOutChannel"
                 method="process" output-channel="cardNetworkInChannel"/>

<!-- Input from Card Network -->
<int:channel id="cardNetworkInChannel" />

<int:service-activator input-channel="cardNetworkInChannel" ref="switchMessageHandler" method="sendSwitchMessage"
                       output-channel="queueReplyChannel"/>


<int:channel id="queueReplyChannel"/>

<int-jms:outbound-channel-adapter
        destination-resolver="simpleDestinationResolver" connection-factory="jmsConnectionFactory"
        channel="queueReplyChannel" destination-expression="headers.jms_replyTo" />

1 个答案:

答案 0 :(得分:-1)

我刚刚更新了jms sample app以使服务器端使用独立的适配器而不是入站网关,它工作得很好......

<!--    <jms:inbound-gateway id="jmsin" -->
<!--                         request-destination="requestQueue" -->
<!--                         request-channel="demoChannel"/> -->

<channel id="demoChannel"/>

<jms:message-driven-channel-adapter destination="requestQueue" channel="demoChannel" />

<service-activator input-channel="demoChannel" ref="demoBean" output-channel="reply" />

<channel id="reply" />

<jms:outbound-channel-adapter channel="reply" destination-expression="headers['jms_replyTo']" />

启用DEBUG日志记录 - 我们推出了许多有用的东西。

修改

我刚刚把它变成了异步...

<channel id="reply">
    <queue/>
</channel>

<jms:outbound-channel-adapter channel="reply" destination-expression="headers['jms_replyTo']">
    <poller fixed-delay="3000"/>
</jms:outbound-channel-adapter>

<强> EDIT2

根据您在客户端使用的内容,许多客户端要求将入站消息ID用作相关ID。 (默认情况下,对于出站网关,对于命名的回复队列,除非您提供correlation-key),否则这样做。

因此,要设置correlationId,您可以使用标题扩充器;我刚试过这个......

<chain input-channel="reply">
    <header-enricher>
        <header name="jms_correlationId" expression="headers['jms_messageId']" />
    </header-enricher>
    <jms:outbound-channel-adapter destination-expression="headers['jms_replyTo']"/>
    <poller fixed-delay="1000" />
</chain>

如果客户端正在设置相关ID标头,则不会出现问题。