2012-08-13 97 views
2

我最近開始學習JMS,並瞭解了一些概念。不過,我想知道IBM MQ或任何隊列提供程序如何處理來自多線程應用程序的請求。例如JMS多線程概念與MQ

考慮一個應用程序,該應用程序被mutithreaded並配置爲使用MQ將消息發送到大型機主機。該應用程序有一個Put隊列並配置了隊列。想象一下,每個要處理的請求都需要從主機獲取數據。由於隊列只有一個,所有這10條消息都同時放入隊列中。主機處理這些消息並將該答覆發送給客戶端,即應用程序。答覆消息如何不混淆,每個線程都得到自己正確的答覆消息?

某些id在通信時使用,是特定於發送的特定線程的消息嗎?是否需要爲每個新的執行線程建立JMS會話?所有10個請求都使用同一會話嗎?希望能夠詳細解釋這一概念的任何示例或鏈接。

+1

也許你想閱讀這個http://docs.oracle.com/javaee/5/tutorial/doc/bncdx.html或這個http://my.execpc.com/~gopalan/jms/jms.html真的沒有必要用其他一些詞來解釋文檔。他們有非常好的原理圖解釋它是如何工作的。閱讀關於ptp和psm消息類型,它會讓你在那裏。謝謝。 – 2012-08-13 09:07:40

回答

3

JMS支持此與一對夫婦的特徵:

首先,JMSCorrelationId是JMS頭,其用於與相關聯的響應的請求。即每條消息都包含一個全局唯一的(GUUID)JMSMessageId。大型機應用程序應簡單地將請求中的消息ID複製到響應消息中的JMSCorrelationId併發送回共享響應隊列。

所以,只需發送一個請求:

(psuedo code - in one thread, do the following when you need to request data over JMS) 
myMessage = session.createTextMessage("My nice request"); 
messageProducer.send(myMessage); // using some previously setup producer 
// commit if needed 

mc = session.createConsumer(queue,"JMSCorrelationId='"+myMessage.getMessageId()+"'"); 
responseMessage = mc.receive(TIMEOUT); 
if(responseMessage != null){ 
    //got OUR response data 
} 
// close down consumer here. 

訣竅允許多個消費者線程(或應用)是在消費者的選擇。 JMS選擇器類似於SQL或類似查詢語言的子集。在這種情況下,只需選擇JMSCorrelationId與請求發送一段時間後的ID相同的消息。

這是唯一的「安全」設置,您可以對這個設置進行限制,即您擁有一個固定的共享隊列,並且請求必須返回到請求的同一個線程。

爲避免JMS選擇器的開銷,您可以使用臨時隊列作爲回覆,每個請求使用一個臨時隊列,那麼就不會有其他線程監聽特定的響應。獲得性能的另一個選擇是使應用程序更加異步。 JMS實際上提出了這個問題,引發了一個請求,並讓一組消費者線程處理任何異步響應 - 每個線程同樣能夠處理任何響應,例如處理數據並將其放入數據庫(或類似數據庫)中。我不知道這個設計範例是否適用於您的案例,但您至少應該知道它。