集群环境中的JMS出站网关

时间:2015-11-03 15:02:53

标签: spring-integration

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

1 个答案:

答案 0 :(得分:1)

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

修改

没有详细记录(虽然它在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(和选择器表达式)包含网关实例的唯一标识符。

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

因此,正如您所看到的,我们已经考虑过所有可能性,以确保回复到达正确的位置。