2.2.5 デッドメッセージキュー
デッドメッセージキューは,有効期限に達したメッセージなどが移動される特別なローカルキューです。システム内に一つだけ指定できます。自システムのアプリケーションは,ローカルキューと同様にデッドメッセージキューから該当するメッセージを受信できますが,デッドメッセージキューにメッセージを送信することはできません。また,デッドメッセージキューに移動したメッセージは,移動前のキューに新しいメッセージとして再登録できます。さらに,hrmstopqueを使用して,アプリケーションのメッセージの受信を抑止することもできます。
デッドメッセージキューは,永続版リソースアダプタの場合だけ利用できます。永続版リソースアダプタでデッドメッセージキューに移動されるメッセージは,非永続版リソースアダプタでは,即削除されます。
デッドメッセージキューの概要を次の図に示します。
-
作成方法
デッドメッセージキューを作成する方法は,ローカルキューと同じです。ただし,RMDeadMessageQueueNameプロパティにキュー名を指定する必要があります。
(1) デッドメッセージキューへの登録
サーバ間転送以外の通信では,次に示す場合に,メッセージはデッドメッセージキューに登録されます。サーバ間転送の場合のデッドメッセージキューへの登録については,「2.2.5(2) サーバ間転送でのデッドメッセージキューへの登録」を参照してください。
-
メッセージが有効期限に達した場合
キューに登録されているメッセージが有効期限に達した場合,そのメッセージはデッドメッセージキューに移動されます。ただし,デッドメッセージキューに登録されているメッセージは,有効期限をチェックされないので対象外です。
また,次に示すときメッセージはデッドメッセージキューに移動されないで削除されます。
(a)RMDeadMessageQueueNameプロパティの指定がないとき
(b)RMDeadMessageQueueNameプロパティに指定されたキューがないとき
(c)メッセージ数超過やDB障害などの要因によって,デッドメッセージキューへの登録に失敗したとき
-
メッセージの配送回数が最大値に達した場合
receive()またはreceiveNoWait()メソッドを発行してメッセージを受信するアプリケーションやMessage-driven Beanでメッセージの配信を受けるアプリケーションに,Reliable Messagingがキューから取り出したメッセージを渡すことを配送といいます。
Reliable Messagingが処理するメッセージの配送回数の最大値はRMMaxDeliveryNumプロパティで指定します。
キューに登録されているメッセージの配送回数が最大値に達した場合,そのメッセージはデッドメッセージキューに移動されます。ただし,デッドメッセージキューに登録されているメッセージは,配送回数をチェックされないので対象外です。また,次に示すときメッセージはデッドメッセージキューに移動されないで,配送できる状態になります。
(a)RMDeadMessageQueueNameプロパティの指定がないとき
(b)RMDeadMessageQueueNameプロパティに指定されたキューがないとき
(c)メッセージ数超過やDB障害などの要因によって,デッドメッセージキューへの登録に失敗したとき
(2) サーバ間転送でのデッドメッセージキューへの登録
サーバ間転送では,次に示す場合に,メッセージはデッドメッセージキューに登録されます。
-
メッセージの転送中に通信の有効期限に達した場合
メッセージの転送中に通信の有効期限に達した場合,そのメッセージはデッドメッセージキューに登録されます。転送中に通信の有効期限に達する場合の例を次に示します。
(a)転送されてきたメッセージが通信の有効期限に達していたとき
(b)順序保証をしていて,順序が前のメッセージが転送される前に順序があとのメッセージが転送されて,順序が前のメッセージの到達待ちの間に通信の有効期限に達したとき
(a)のときは受信に失敗するため,送信側システムのデッドメッセージキューに登録されます。(b)のとき,順序保証のため滞留している順序があとのメッセージは,ローカルキューには登録されないで,受信側システムのデッドメッセージキューに登録されます。順序保証については,「2.4.4 キュー間転送のQoS」を参照してください。
メッセージ数の超過やDB障害などの要因によってデッドメッセージキューへの登録に失敗した場合は,デッドメッセージキューへの登録をリトライし続けます。
通信の有効期限に達した場合の処理を次の図に示します。
図2‒8 メッセージの転送中に通信の有効期限に達した場合の処理 -
電文不正などの障害でメッセージの受信に失敗し,かつ再送もできない場合
電文不正などの障害でメッセージの受信に失敗し,かつ再送もできない場合は,そのメッセージは送信側システムのデッドメッセージキューに登録されます。
また,受信に失敗したメッセージが順序保証をしていて,かつすでに受信側システムには順序保証のために滞留しているメッセージがあった場合,滞留しているメッセージはすべて受信側システムのデッドメッセージキューに登録されます。
メッセージ数の超過やDB障害などの要因によってデッドメッセージキューへの登録に失敗した場合は,デッドメッセージキューへの登録をリトライし続けます。
メッセージの転送ができない場合の処理を,受信側システムに滞留しているメッセージがない場合と滞留しているメッセージがある場合に分けて,次の図に示します。
図2‒9 電文不正などの障害でメッセージの受信に失敗した場合の処理