2011-02-17 107 views
4

假設有一個移動應用程序需要對來自服務器的某些數據進行同步請求/查詢。請求將首先發送到託管的JMS客戶端,它將在外部隊列(來自合作伙伴)上發佈消息/請求。現在在這裏開始不清楚。我如何以同步方式獲得合作伙伴的回覆。使用JMS/WMQ可以實現同步消息傳遞?

  • 如果合作伙伴揭露單獨的隊列爲我訂閱,然後我阻止移動請求,直到我從單獨的隊列得到的迴應消息?
  • JMS或專有WebSphere MQ接口是否支持同步消息傳遞?
  • 什麼是通過消息傳遞實現它的其他方法?

感謝

回答

4

教科書模式如下:

  1. JMS應用接收到來自移動設備的請求。
  2. JMS應用程序打開回復隊列(可能是動態的)。
  3. JMS應用程序準備指定來自#2的目的地作爲JMSREplyTo目的地的請求消息。
  4. JMS應用程序將同步點之外的請求發送到外部服務提供者。
  5. JMS應用程序偵聽具有指定等待間隔的響應。如果它使用動態回覆隊列,它會進行簡單的接收。如果多個實例正在同一個隊列上偵聽(這更可能用於外部服務),那麼它會使用從send返回的JMSMessageID作爲在接收端指定的JMSCorrelationID。
  6. JMS應用程序接收來自外部服務的響應。
  7. JMS應用程序回覆移動設備。

請注意,對於WMQ,服務提供者的預期行爲是將JMSMessageID從請求消息複製到響應的JMSCorrelationID。要求發送者生成JMSCorrelation ID並將其複製到響應的JMSCorrelationID中是不常見的,但是一些應用程序使用該行爲。您需要了解您的服務提供商如何處理此問題,以確定請求者應用程序的正確行爲。

如果您使用的是完整的WMQ客戶端安裝,您將已經擁有大部分代碼。如果安裝到默認位置,看在...

C:\Program Files\IBM\Websphere MQ\tools\jms\samples\simple\simpleRequestor.java

...或/var/mqm下的等價位置UNIX/Linux發行版。這是安裝完整客戶端而不是簡單地抓取jar文件的諸多原因之一。如果您需要下載的客戶端是交付爲SupportPac MQC7

+0

感謝T.Rob, \ n 我們沒有WMQ服務器。答覆隊列(從1開始)也可以是遠程隊列嗎?這樣我們就可以成爲一個純粹的客戶端,並且不必託管服務器?或者你必須有本地回覆隊列? 此外,這種情況下工作在併發環境?就像數百個移動設備將通過相同的消費者發送消息並通過同一個聽衆接收響應一樣。 – user567068 2011-02-18 03:11:50

0

在我的頭頂,我看到2種方式。

  1. 創建2個隊列:傳入和傳出。客戶端發送到傳入隊列並從傳出隊列接收消息。

  2. 您可以對兩者使用相同的隊列。只需爲每條消息設置特殊屬性並使用選擇器來僅過濾相關消息。

您的服務器端應先發送消息,然後調用receive方法(請參閱JMS的javadoc)。此方法被阻止,直到您收到消息或超時過期。使用這種方式並且不聽信息很重要(監聽器用於異步模式)

2

「客戶端」可以創建臨時隊列並在請求中傳遞此名稱。

「服務器」在已知隊列上接收請求,但發送具有「客戶機」指定的隊列名稱的「replyTo」。

JMS具有用於此目的的「replyTo」屬性。

這樣客戶端只能看到針對它的消息。