Spring integration Spring集成DSL JMS请求/应答流

Spring integration Spring集成DSL JMS请求/应答流,spring-integration,spring-jms,Spring Integration,Spring Jms,我正在尝试使用Spring Integration Java DSL创建一个请求/应答流,如下所述: IntegrationFlows.from(directChannel) .handle(Jms.outboundGateway(connectionFactory) .requestDestination(requestDestination) .replyDesti

我正在尝试使用Spring Integration Java DSL创建一个请求/应答流,如下所述:

IntegrationFlows.from(directChannel)
                .handle(Jms.outboundGateway(connectionFactory)
                        .requestDestination(requestDestination)
                        .replyDestination(replyDestination))
                .handle(replyHandler)
                .get();
如果我杀死了应该处理回复的应用程序,那么回复将留在队列中,并且在下次应用程序启动时不会被使用。当我使用此流发送跟进请求时,会收到上一条消息,而不是最新的答复

我正在测试的消息流如下所示

应用程序A发送消息->停止A->应用程序B接收消息并发送回复R1

A启动->A发送另一条消息->B接收消息并发送 回复R2->A收到R1

R2留在队列中

我做错什么了吗


谢谢

这种情况根本不应该发生,我希望R1永远留在队列中,因为网关使用消息选择器来接收基于出站消息id的回复。因此,新实例不应该选择旧消息

在此模式下,它期望接收应用程序将入站消息id复制到
JMSCorrelationID
头。当入站消息没有
JMSCorrelationID
时,这是一种常见的JMS模式

尝试将
correlationKey
设置为
JMSCorrelationID
。在该模式下,请求网关为每个实例使用一个唯一的id,它希望接收端简单地回显入站
JMSCorrelationID


如果您可以从两侧获取调试日志,可能会有助于跟踪它。

感谢您的回复。如果因为每条消息都很重要且需要处理,所以我希望使用这条旧消息,那么我是否应该创建一个单独的集成流,并使用一个通道来侦听回复队列?这在请求/回复场景中没有意义,因为请求者不再在那里接收响应。它会被送到哪里?如果您想要任意双向消息传递(而不是请求/应答),那么,是的,您应该使用通道适配器(出站和入站)。然后由你来做相关。谢谢!现在有道理了。