Spring 来自原始jmsReplyTo的jms动态目标
有一个请求队列,而应答队列由客户机服务器实例创建,并固定到每个实例,而不是使用临时队列 用例需要获取入站jms消息,然后将该消息发送到异步进程。从服务接收到异步回复消息后,我需要获取这些结果并回复回原始消息的jmsReplyTo。Jms网关在此实例中无法工作AFAIK> 我正在为中的消息使用jms消息驱动的通道适配器,并使用一系列通道和服务激活器来处理进程外调用和异步回复。我试图使用DynamicDestinationResolver,但没有任何效果。此外,我还尝试通过编程设置出站目的地地址,但找不到一个好方法 这似乎是一种常见的模式,但我找不到一个完全断开连接的异步请求响应的好例子。断开连接意味着通常的异步jms请求-应答似乎不适合需要 上下文配置:Spring 来自原始jmsReplyTo的jms动态目标,spring,asynchronous,spring-integration,spring-jms,Spring,Asynchronous,Spring Integration,Spring Jms,有一个请求队列,而应答队列由客户机服务器实例创建,并固定到每个实例,而不是使用临时队列 用例需要获取入站jms消息,然后将该消息发送到异步进程。从服务接收到异步回复消息后,我需要获取这些结果并回复回原始消息的jmsReplyTo。Jms网关在此实例中无法工作AFAIK> 我正在为中的消息使用jms消息驱动的通道适配器,并使用一系列通道和服务激活器来处理进程外调用和异步回复。我试图使用DynamicDestinationResolver,但没有任何效果。此外,我还尝试通过编程设置出站目的地地址,但
<!-- 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>