集群环境中的 JMS 出站网关

JMS Outbound Gateway on a clustered environment

我们将 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"
/> 

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

编辑

它没有任何详细记录(尽管在 gateway attributes section 中关于 correlation-key 的讨论中暗示了它)但请放心,回复只会发送到原始网关。实际机制取决于配置。

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

String messageSelector = "JMSCorrelationID = '" + messageId + "'";

... 由 JMS 客户端库唯一分配。这依赖于接收方将消息 ID 复制到相关 ID(这是一种常见模式,由 SI 入站网关以及 Spring JMS MessageListenerAdapter 实现)。

correlation-key 设置为 JMSCorrelationID 将告诉网关使用它,在这种情况下,它被设置为生成的值并且...

messageSelector = "JMSCorrelationID = '" + correlationId + "'";

...这依赖于接收器回显相关 ID(这又是通常的模式)。

如果存在 <reply-listener/>correlation-key,相关 ID(和选择器表达式)包括网关实例的唯一标识符。

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

因此,如您所见,我们考虑了所有可能的方法来确保回复到达正确的位置。