集群环境中的 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(和选择器表达式)包括网关实例的唯一标识符。
最后,如果没有定义回复队列,则使用临时队列。
因此,如您所见,我们考虑了所有可能的方法来确保回复到达正确的位置。
我们将 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(和选择器表达式)包括网关实例的唯一标识符。
最后,如果没有定义回复队列,则使用临时队列。
因此,如您所见,我们考虑了所有可能的方法来确保回复到达正确的位置。