我寫了一個MQ應用程序,它是exe,但它只運行一個實例並終止自己。所需的功能是讓它連續運行並不斷處理數據,一旦數據耗盡,它應該不斷監聽新數據。如何使MQ應用程序exe連續運行?
可能有人請告訴我需要做什麼?
謝謝!
我寫了一個MQ應用程序,它是exe,但它只運行一個實例並終止自己。所需的功能是讓它連續運行並不斷處理數據,一旦數據耗盡,它應該不斷監聽新數據。如何使MQ應用程序exe連續運行?
可能有人請告訴我需要做什麼?
謝謝!
我建議您將您的代碼轉換爲Windows服務。看到這裏的.NET啓動程序:Introduction to Windows Service Applications
當前您的應用程序可能循環通過消息,直到它得到返回代碼指示該隊列爲空。爲了不斷收聽新數據,您需要做兩件事:
Receive()
。你必須結合這與下一個建議雖然。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。
如果您使用的是.NET接口,那麼請查看另一個用於.NET a.k.a XMS .NET的IBM Message Service Client。 XMS .NET提供了一個類似API的JMS,但採用.NET語言。它有一個消息監聽器,通過它可以異步接收消息。
XMS作爲MQ v7客戶端SupportPac MQC7的一部分進行安裝。
是關於IBM MQ或自定義消息隊列的這個問題嗎? –