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實際上提出了這個問題,引發了一個請求,並讓一組消費者線程處理任何異步響應 - 每個線程同樣能夠處理任何響應,例如處理數據並將其放入數據庫(或類似數據庫)中。我不知道這個設計範例是否適用於您的案例,但您至少應該知道它。
也許你想閱讀這個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