Spring integration 集群环境中的JMS出站网关

Spring integration 集群环境中的JMS出站网关,spring-integration,Spring Integration,我们将把Spring集成代码部署到运行在多个tomcat服务器上的web应用程序中。我们有一个JMS出站网关,如下所示。问题是,一个servlet容器JVM(比如tomcat1)发送的消息是否可能被另一个servlet容器JVM(比如tomcat2)接收?在我们的例子中,在spring集成流中,我们将消息拆分为多条消息,并将其发送到JMS出站网关,一旦收到响应,我们将使用将消息聚合回同一JVM上 因此,如果其他JVM接收到响应,这将成为一个问题。有人知道这件事吗 <int-jms:outb

我们将把Spring集成代码部署到运行在多个tomcat服务器上的web应用程序中。我们有一个JMS出站网关,如下所示。问题是,一个servlet容器JVM(比如tomcat1)发送的消息是否可能被另一个servlet容器JVM(比如tomcat2)接收?在我们的例子中,在spring集成流中,我们将消息拆分为多条消息,并将其发送到JMS出站网关,一旦收到响应,我们将使用将消息聚合回同一JVM上

因此,如果其他JVM接收到响应,这将成为一个问题。有人知道这件事吗

<int-jms:outbound-gateway id="wldpJMSGateway"
connection-factory="cachedConnectionFactory"
extract-reply-payload="true"
request-channel="wldpJMSGatewayChannel"
request-destination-name="WLDP.REQUEST.QUEUE"
reply-channel="wldpJMSResponseChannel"
reply-destination-name="WLDP.RESPONSE.QUEUE"
receive-timeout="5000"
extract-request-payload="true"
/> 

回复将返回到正确的网关;使用消息选择器

编辑

它没有任何详细的文档记录(尽管在中关于
相关键的讨论中有所暗示),但请放心,回复只会发送到原始网关。实际机制取决于配置

对于您的配置,消息选择器基于传出的
JMSMessageID

String messageSelector = "JMSCorrelationID = '" + messageId + "'";
。。。它是由JMS客户端库唯一分配的。这依赖于接收方将消息id复制到相关id(这是一种常见模式,由SI入站网关以及Spring JMS
MessageListeneraAdapter
实现)

correlation键设置为
JMSCorrelationID
将告诉网关改用该键,在这种情况下,将其设置为生成的值并

messageSelector = "JMSCorrelationID = '" + correlationId + "'";
…这取决于接收器回显相关id(这也是通常的模式)

如果存在
相关键
,则相关id(和选择器表达式)包括网关实例的唯一标识符

最后,如果未定义回复队列,则使用临时队列


因此,正如您所看到的,我们已经考虑了所有可能的方法来确保回复正确。

感谢您的回复。我看到这里有记录。但是,即使在集群环境中,这是否也能起作用还不是很清楚。我认为在集群环境中,所有网关(在不同的JVM中)都将侦听响应队列。您是否建议网关使用某种机制来检测来自同一jvm的消息,或者不使用该消息?如果你能给我一些文档,我可以通读一遍。非常感谢Gary对我的行为进行更多的解释和确认。