我们将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"
/>
答案 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(和选择器表达式)包含网关实例的唯一标识符。
最后,如果没有定义回复队列,则使用临时队列。
因此,正如您所看到的,我们已经考虑过所有可能性,以确保回复到达正确的位置。