2016-01-22 62 views
0

我正在嘗試編寫MQ客戶端,它將抵抗意外情況。 我已創建客戶端CLIENT_ACKNOWLEDGE模式:XMS mq client_acknowledge - 分別確認消息

ISession session = conn.CreateSession(false, AcknowledgeMode.ClientAcknowledge); 

在XMS文檔存在用於CLIENT_ACKNOWLEDGE信息:

應用程序可以確認收到每個消息 單獨,或它可以接收一個批次並僅對其收到的最後一條消息致電 確認方法。當 確認方法被調用時,自上次調用 以來收到的所有消息都被確認。

客戶端從隊列中提取例如10條消息並將它們寫入數據庫。

問題是如何在確認每條消息(用於確保消息傳遞)的情況下設置此模式?

+0

您是否試圖做這樣的事情:您收到了10條消息,但您只想確認該批處理的一條消息,比如5或8位?如果這樣做是不可能的。正如doc所說,XMS將會收到所有收到的消息。 – Shashi

+0

在當前實現中,我確認收到的每個單個消息。我需要確保不會丟失任何消息。如果第5條消息將被查詢並出現問題,例如我們失去了第3條(它將與第5條消息一起發送,而不是重新發送) 有什麼方法可以確定順序的順序嗎? – moniuh

回答

1

當消息傳遞到應用程序時,它是如何丟失的?

既然您正在處理兩個資源,爲什麼不去處理會話或XA事務處理會話。如果更新數據庫時出現問題,您可以進行回滾,以便重新傳遞消息。

更新

在事務處理會話,確認模式沒有意義。消息在調用提交時被確認,或者在回滾被調用時被回滾。

如果與IBM MQ隊列管理器的連接丟失,則隊列管理器會自動回滾所有未提交的消息。所以沒有消息丟失。

+0

具有自動確認的基於事務的會話似乎是解決該問題的方法。 請參閱本文檔(它適用於Java,但總體思路相同):http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc /q032220_.htm?lang=en 如果在消息處理或寫入數據庫期間出現任何問題,請執行回滾。如果一切正常,請執行交易。 – MuhKuh

+0

但自動確認消息是否安全?當我以10-50的包的形式獲取消息時,如果客戶端使用消息(等待或nowait模式)時發生與MQ連接的事件,如何處理所有意外情況以確保沒有消息丟失? – moniuh

+0

查看我更新的答案 – Shashi