2009-05-26 158 views
5

我從WebSPhere MQ隊列收到消息。我嘗試處理,如果收到一些異常,我想將消息回滾到MQ隊列。如果消息在MQ中回滾會發生什麼情況?

我在做同樣的事情上沒有問題。信息會發生什麼?它是否進入隊列底部?

如果我嘗試從隊列中拉出消息,我會收到同樣的消息,我回滾?

可能是什麼行爲?我想通常在高容量隊列場景中知道這種行爲?

欣賞任何輸入。

感謝, Manglu

回答

5

如果你在一個事務的範圍內做隊列操作,併發生回滾,事務解析隊列和信息出現正如它的事務開始之前再經過。換句話說,根本沒有改變。

但是,在大容量場景中,通常在單個隊列上具有多個事務讀取器和寫入器,並且不會爲每個出列隊列或隊列鎖定整個隊列。

這些讀者和作者將在註定的事務解決時將事件插入隊列中,或事務性地從隊列中取出隊列。在這種情況下,其他隊列項目可能會出現或消失(或兩者)。

如果在原始事務回滾之後,您再次從隊列中退出,您可能會收到原始消息,但您可能不會。在高容量,高併發的情況下,其他讀者有可能在您的代碼執行之前拉取消息。

3

回滾將消息留在隊列中,並將其放回以重新傳送。

但是,當達到(可配置的)重新傳送嘗試的限制時,該消息被放在「死信隊列」上。

發生這種情況的典型例子是s.c. '有害信息':由於基本和非暫時性問題(如格式無效,缺少字段等)而無法處理的信息。

因此,在回滾(並將消息放回隊列中)之前,請務必考慮錯誤是否是暫時的(例如連接到後端的連接斷開)。

在後一種情況下,最好吞下消息並記錄錯誤或觸發其他警報。否則,該消息將不必要地消耗處理能力和隊列基礎設施。

HTH

蓋伊

+0

馬克, 我的理解是達到回來了門檻之後,mesage發送到背出隊列,而不是死信隊列。只有當消息不能寫入BOQ時才發送給DLQ。 Manglu – Manglu 2009-06-23 03:33:26

3

要回答幾個具體要點從這個線程...

  • 消息保留它在隊列中的位置。同步點下的GET鎖定消息,但不會將其從隊列中移除或更改其位置。回滾釋放鎖並使消息可用於重新傳送。
  • 有毒消息的自動重新處理髮生在JMS和XMS類中,但不是本機Java,C,C#,COBOL等API。如果您沒有使用JMS或XMS(它爲C和.Net程序實現JMS API),那麼您需要自己重新發送消息。
  • 在超過BOQTHRESH重新獲得輸入隊列的BOQNAME屬性中指定的隊列上嘗試執行requeue的操作是正確的。如果該隊列不可用(完整,未授權,不存在等),則嘗試DLQ。如果失敗,則消息監聽器完全停止接收消息。
  • 理想情況下,程序將通過重新處理有毒消息並警告異常隊列中消息的存在。如果不這樣做,至少不要只是消耗和丟棄信息。將它與消息標題一起記錄下來,以便以後可以協調發生的事情。
相關問題