2011-11-21 92 views
2

我寫了一個MQ應用程序,它是exe,但它只運行一個實例並終止自己。所需的功能是讓它連續運行並不斷處理數據,一旦數據耗盡,它應該不斷監聽新數據。如何使MQ應用程序exe連續運行?

可能有人請告訴我需要做什麼?

謝謝!

+0

是關於IBM MQ或自定義消息隊列的這個問題嗎? –

回答

4

當前您的應用程序可能循環通過消息,直到它得到返回代碼指示該隊列爲空。爲了不斷收聽新數據,您需要做兩件事:

  1. 當您取回「空隊列」的返回碼時,不要退出循環。循環並嘗試另一個Receive()。你必須結合這與下一個建議雖然。
  2. 當您執行Receive()時,請使用超時。例如,consumer.Receive(20000)將在超時之前等待20秒以等待下一條消息。

如果不包括超時,那麼應用程序將在QMGR扔不滿意GET請求的龐大的數字將出現搶手的應用程序和/或失控QMGR,你會看到高CPU進程利用。

你可以在Receive()之間睡覺,但這不是很高效。僅當沒有消息可用時,使用Receive(TIMEOUT)纔會阻塞該線程。只要消息到達,就不會有任何延遲將其傳遞給線程。如果您手動睡眠線程,它必須輪詢隊列,並且只會在設置sleep()時間間隔內執行此操作。

另一種方法是,您可以設置一個回調方法,以便線程不會阻塞。例如,如果您有回撥方法OnNewMessageCallback,則可以使用MessageListener messageListener = new MessageListener(OnNewMessageCallback);

創建一個異步消息偵聽器。這兩種方法都在示例中進行了描述。如果您安裝了SDK和樣本,則這些文件將在C:\Program Files (x86)\IBM\WebSphere MQ\tools\dotnet\samples或等效文件下,具體取決於您安裝WMQ的位置。

如果您想知道如何區分「無隊列消息」和更嚴重錯誤之間的區別,請檢查MQException.ReasonCode。如果是2033,則Receive()超時。這和所有其他原因代碼被定義爲here

一旦你有一個程序可以成功循環並等待新消息,那麼你可以選擇像Simon的迴應那樣將其作爲服務運行,或者像現在這樣交互式地運行它。

如果您正在開發WMQ v6,請注意v6是2012年9月的服務終止服務,並且WMQ的v7.0或v7.1中的.Net集成更好。您可以從SupportPac MQC7下載帶有.Net類的最新WMQ v7.0客戶端。相應的Infocenter是here。 v7.1客戶端在發佈時將爲SupportPac,但確切的名稱尚不得而知。我會盡量記住在鏈接可用時用鏈接更新。截至今日,v7.1客戶端可通過Passport Advantage使用您的IBM客戶帳戶使用。 v7.1 Infocenter是here

1

如果您使用的是.NET接口,那麼請查看另一個用於.NET a.k.a XMS .NET的IBM Message Service Client。 XMS .NET提供了一個類似API的JMS,但採用.NET語言。它有一個消息監聽器,通過它可以異步接收消息。

XMS作爲MQ v7客戶端SupportPac MQC7的一部分進行安裝。