Spring 来自原始jmsReplyTo的jms动态目标

Spring 来自原始jmsReplyTo的jms动态目标,spring,asynchronous,spring-integration,spring-jms,Spring,Asynchronous,Spring Integration,Spring Jms,有一个请求队列,而应答队列由客户机服务器实例创建,并固定到每个实例,而不是使用临时队列 用例需要获取入站jms消息,然后将该消息发送到异步进程。从服务接收到异步回复消息后,我需要获取这些结果并回复回原始消息的jmsReplyTo。Jms网关在此实例中无法工作AFAIK> 我正在为中的消息使用jms消息驱动的通道适配器,并使用一系列通道和服务激活器来处理进程外调用和异步回复。我试图使用DynamicDestinationResolver,但没有任何效果。此外,我还尝试通过编程设置出站目的地地址,但

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

用例需要获取入站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" />


我刚刚更新了,使服务器端使用独立的适配器,而不是入站网关,并且工作正常

<!--    <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']" />
如果客户端正在设置相关id头本身,则这不是问题。

我刚刚更新了,以使服务器端使用独立的适配器而不是入站网关,并且工作正常

<!--    <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']" />


如果客户端正在设置相关id头本身,则这不是问题。

很抱歉,您的问题根本不清楚。请尽量说得非常具体。。。e、 g.“网关无法工作……”。客户端?还是服务器端?您应该能够在两侧使用出站适配器和消息驱动适配器,并在出站适配器上使用目标表达式。抱歉,Gary-从ActiveMQ的角度来看,这是一个服务器端组件。应用程序使用来自固定队列的消息。然后,它通过特定的协议通过TCP进行通信,并通过TCP接收回复。然后需要将这些回复发送回ActiveMQ,引用原始入站ActiveMQ消息的jmsReplyTo地址。在设计时,此服务器组件不知道对队列的答复是什么。此应用程序的客户端(ActiveMQ)每个都会创建一个客户端独有的答复队列。好的,但您需要准确解释问题所在。ActiveMQ客户端没有收到响应,因为我猜服务器端jms出站通道适配器没有设置目标。很抱歉,您的问题一点也不清楚。请尽量说得非常具体。。。e、 g.“网关无法工作……”。客户端?还是服务器端?您应该能够在两侧使用出站适配器和消息驱动适配器,并在出站适配器上使用目标表达式。抱歉,Gary-从ActiveMQ的角度来看,这是一个服务器端组件。应用程序使用来自固定队列的消息。然后,它通过特定的协议通过TCP进行通信,并通过TCP接收回复。然后需要将这些回复发送回ActiveMQ,引用原始入站ActiveMQ消息的jmsReplyTo地址。在设计时,此服务器组件不知道对队列的答复是什么。此应用程序的客户端(ActiveMQ)每个都会创建一个客户端独有的答复队列。确定,但您需要准确解释问题所在。ActiveMQ客户端没有收到响应,因为我猜服务器端jms出站通道适配器没有设置目标。我正在查找该目标表达式。客户端仍然没有收到响应。我已调试,无法确定出站目标队列,但我将打开调试日志,看看能找到什么。我认为,如果您有一个异步进程从demoBean发送消息,另一个服务激活器在点击上述示例中的回复通道之前异步接收消息,那么您的示例将更加准确。在这种情况下,demoChannel上的原始入站消息和出站回复通道之间的链断开。请参阅我的编辑-添加队列通道使其异步。对我来说仍然很好。你在客户端使用什么?基于目标表达式接受。客户端不再接收消息,但应答明显在队列中。最好的猜测是客户端有一个消息选择器试图匹配应答中的内容。如果您不控制客户机,您的代理可能会提供一种机制来确定它是什么(例如,ActiveMQ通过web控制台执行)。Spring集成将回显客户端上设置的任何头(例如JMSCorrelationId)。当未提供相关密钥时,入站网关会插入messageId作为相关id。因此,我建议尝试使用头enricher执行同样的操作。目标表达式就是我想要的。客户端仍然没有收到响应。我已调试,无法确定出站目标队列,但我将打开调试日志,看看能找到什么。我认为,如果您有一个异步进程从demoBean发送消息,另一个服务激活器在点击上述示例中的回复通道之前异步接收消息,那么您的示例将更加准确。在这种情况下,demoChannel上的原始入站消息和出站回复通道之间的链断开。请参阅我的编辑-添加队列通道使其异步。对我来说仍然很好。你在客户端使用什么?基于目标表达式接受。客户端不再接收消息,但应答明显在队列中。最好的猜测是客户端有一个消息选择器试图匹配应答中的内容。如果您不控制客户机,您的代理可能会提供一种机制来确定它是什么(例如ActiveMQ doe)
<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>