我正在尝试使用Spring Integration Java DSL创建一个请求/回复流程,如下所述:
IntegrationFlows.from(directChannel)
.handle(Jms.outboundGateway(connectionFactory)
.requestDestination(requestDestination)
.replyDestination(replyDestination))
.handle(replyHandler)
.get();
如果我杀死了应该处理回复的应用程序,那么回复将留在队列中,并且在下次应用程序启动时不会被使用。当我使用此流程发送跟进请求时,会收到上一条消息,而不是最新的回复。
我正在测试的消息流看起来像
App A发送消息 - >停止A - >应用B接收消息并发送回复R1
A启动 - > A发送另一条消息 - > B接收消息并发送 回复R2 - > A收到R1
R2留在队列中
我做错了吗?
谢谢!
答案 0 :(得分:1)
根本不应该以这种方式发生,我希望R1永远保留在队列中,因为网关使用消息选择器根据出站消息ID接收回复。所以新实例永远不应该选择旧消息。
在此模式下,它希望接收应用程序将入站消息ID复制到JMSCorrelationID
标头。当入站消息没有JMSCorrelationID
时,这是一种常见的JMS模式。
尝试将correlationKey
设置为JMSCorrelationID
。在该模式下,请求网关每个实例使用一个唯一的id,并且它希望接收方只是回显入站JMSCorrelationID
标头。
如果您可以双方都获得调试日志,则可能有助于跟踪它。