[JMS][WMQ] poison message

■ポイズン・メッセージ
受信したMDBアプリが処理できないメッセージのこと。

ポイズン・メッセージがMDBに送信されると
Beanは↓のどれか1コを実行できる。
 メッセージを元の宛先にロールバックする
  MDBがトランザクション内で実行されていれば可能。
  メッセージが失われないことが保証される。
  データベースの使用不可等、一時的な問題で、
  アプリがメッセージを処理出来ない場合に有効。
  ※メッセージをロールバックするには、
   MDBはBeanと関連付けられたメッセージ駆動型コンテキストで
   setRollbackOnly()を呼ぶ。
 メッセージを別の宛先に移動する
  ポイズンメッセージは失われないため、
  MDBがトランザクション内で実行されていない場合に有効。
  システム管理者は、
  再処理できるようにMDBがモニタしてる宛先に送り返せる。
 何もせずにメッセージを破棄する。
  メッセージは、永久に失われる。


■ポイズン・メッセージのロールバック
ポイズン・メッセージのロールバックにおけるAPサーバの挙動は
使用されているJMSプロバイダによって異なる。

□デフォルト・メッセージング・プロバイダを使用した場合
3つのプロパティ値で挙動が決まる。
 [DeliveryCount]
  JMSメッセージ・プロパティ。
  JMSメッセージがAPに送信された回数を示す。
  送信後にMDBがメッセージを拒否しば場合にインクリメントされる。
 [Mazimum failed deliveries]
  最大デキバリー失敗数。
  JMS宛先プロパティ。
  デフォルト:5。
  宛先のメッセージがこの宛先に対して定義された例外宛先に
  移動される前に、MDBに送信される回数を示す。
  デフォルトでは、5回ロールバックされると、
  APサーバは、メッセージを別の場所に移す。
 [Exception destination]
  例外宛先。
  JMS宛先プロパティ。
  デフォルト:システム。
  最大デリバリ失敗数プロパティでして回数だけロールバックされた
  ポイズン・メッセージをAPサーバにどう処理させるかを指定する。
  以下3つから1つを指定:
  ①システム [System]:
    メッセージをシステム例外宛先↓に送付する。
    _SYSTEM.Exception.Destination.
  ②なし [None]:
    メッセージを元の宛先に残す。
  ③指定 [Specify]:
    メッセージをユーザ指定の例外宛先に移動する。

□sib.processor.blockedRetryTimeout
メッセージング・エンジン・カスタム・プロパティ。
※例外宛先プロパティが[None]の場合にのみ、有効になる設定。
ポイズンメッセージをMDBに再送信する前にAPサーバが待つ時間を指定する。

メッセージがロールバックされると、
そのDeliveryCountがインクリメントされ、
メッセージが当初送信された宛先の最大デリバリ失敗数と比較される。
DeliveryCount<最大デリバリ失敗数 の場合:
 メッセージの再処理ができるように宛先に返される。
DeliveryCount≧最大デリバリ失敗数の場合:
 メッセージングエンジンは指定された例外宛先にメッセージを移動する。
 もしくは、
 例外宛先が[None]の場合、再送する前に、
 sib.processor.blockedRetryTimeout時間分、待ってから移動する。

□デフォルトの動作
最大デリバリー失敗数=5
例外宛先=システム

MDBはmsgを処理できない→msgをロールバックしてDeliveryCountを1に増やされる
DeliveryCountは宛先の最大デリバリー失敗数 より小さい→メッセージング・エンジンはメッセージを宛先に返す

MDBはメッセージを再度受信するが以前処理できない→①同様にrollbackする
DeliveryCountは2になる
2でも最大デリバリー失敗数 より小さい→もとの宛先に返す

DeliveryCountが5に成るまで繰り返し

DeliveryCount=最大デリバリー失敗数 になると メッセージは_SYSTEM.Exception.Destination.として指定された宛先の例外宛先に移動する

□分散環境での動作
MDBがmessageをrollbackする時
アプリサーバの動作は4つのpropertyで決まる
-リスナー・ポート・プロパティー 最大再試行数(maximum retries)
 listenerPortを停止する前にmessage listener serviceがMDBにmessageを送信する回数
 defaule=0
 MDBがmessageを始めてrollbackする時に そのlistenerPortがshutDownする
-JMSメッセージ・プロパティー(DeliveryCount)
 JMSメッセージがAPに送信された回数
 MDBが送信後にメッセージを拒否するとインクリメントされる
-WebSphere MQ キュー・プロパティ バックアウトしきい値(BOTHRESH)
 messageが別の場所に移動される前にqueueに入れる琴が出来る最大回数
 default=0
 ※ message listener serviceはMDBによってrollbackされたmessageを再度queueに入れることはない
-WebSphere MQ キュー・プロパティー バックアウト・リキュー・キュー(BQQNAME)
 messageがbackoutしきい値までキューにbackoutされた時のメッセージの行く先
 default=なし→SYSTEM.DEAD.LETTER.QUEUEに行く

要は
DeliveryCount >= listener port最大試行数 : listener portを停止
DeliveryCount < backoutしきい値 : msgはqueueに残りサイド処理される
DeliveryCount = backoutしきい値 : msgはbackout requeue queueに行く
backout requeue queueの定義がない場合 : SYSTEM.DEAD.LETTER.QUEUEに行く
の順に挙動が決まる


ref:
WebSphere Application Server V6によるポイズン・メッセージの処理方法
http://www.ibm.com/developerworks/jp/websphere/library/was/was6_jms_poison/

tag : WebSphere MQ WMQ JMS poison message SYSTEM.DEAD.LETTER.QUEUE backout requeue queue

2009-04-24 06:27 : 開発 : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud