2015-11-03 63 views
2

我們將部署Spring集成代碼到運行在多個tomcat服務器上的Web應用程序。我們有一個如下所示的JMS出站網關。問題在於是否有可能由其中一個servlet容器JVM(如tomcat1)發送的消息可以被另一個servlet容器JVM(如tomcat2)接收?在我們的例子中,在春季集成流程中,我們將消息拆分爲多條消息並將其發送到JMS出站網關,一旦收到響應,我們將使用將消息聚合回同一個JVM。羣集環境中的JMS出站網關

所以如果其他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

答覆將回到正確的網關;使用消息選擇器。

編輯

它沒有任何詳細記錄(儘管它在gateway attributes section在討論關於correlation-key暗示),但是放心的答覆只能去發起網關。實際的機制取決於配置。

您的配置,消息選擇是基於傳出JMSMessageID ...

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

...這是唯一由JMS客戶端庫分配。這依賴於接收器將消息ID複製到相關ID(這是一種常見模式,由SI入站網關以及Spring JMS MessageListenerAdapter實現)。

設置correlation-keyJMSCorrelationID會告訴網關,與其使用,在這種情況下,它被設置爲一個生成的值,並...

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

...這依賴於接收機的迴音關聯ID(這又是通常的模式)。

如果存在<reply-listener/>correlation-key,則相關性id(和選擇器表達式)包括網關實例的唯一標識符。

最後,如果沒有定義應答隊列,則使用臨時隊列。

所以,正如你所看到的,我們已經想到了確保回覆到正確位置的所有可能性。

+0

感謝您的回覆。我看到它在http://docs.spring.io/spring-integration/reference/html/jms.html中有記錄。然而,即使在集羣環境中,這也不是很清楚。我認爲在集羣環境中,所有網關(在不同的jvms中)都會在響應隊列上進行監聽。您是否建議網關有一些機制來檢測消息是否源自相同的jvm其他消息不消息?如果你能指導我閱讀一些文檔,我可以通讀一下。 –

+0

看到我編輯的答案。 –

+0

非常感謝Gary的更多解釋和確認行爲。 –