2.4.4 メッセージシーケンス番号でのメッセージの管理
MCAは,メッセージの二重送信を抑止するため,メッセージにメッセージシーケンス番号を付けます。各チャネルの送信側MCAは,メッセージにメッセージシーケンス番号を付けて送信します。
- 〈この項の構成〉
(1) メッセージシーケンス番号の遷移
メッセージシーケンス番号は,送信側MCAがメッセージに1から一つずつ昇順に付けるチャネル単位のメッセージ転送番号です。TCP定義のmqtalccha定義コマンドの-wオプションで指定したメッセージシーケンス番号の最大値を超えると,1に戻ります。この最大値は,相手チャネルと同じ値を定義する必要があります。チャネル確立直後に送受信する1番目のメッセージに与えられるメッセージシーケンス番号の決定の順序を次の図に示します。
|
チャネル確立直後に送受信する2番目のメッセージからチャネル解放までのメッセージのメッセージシーケンス番号は,直前のメッセージのメッセージシーケンス番号から一つずつ昇順に付けられます。
(2) リセットコマンド実行後のチャネルの動作
送信側MCAと受信側MCAで,メッセージシーケンス番号のリセットコマンド(TP1/Message Queueの場合はmqtrstchaコマンド)を実行して,メッセージシーケンス番号をリセットしたあとのチャネルの動作を次の図に示します。
|
なお,図中の送信側MCAは,センダ,サーバ,またはクラスタセンダです。また,受信側MCAは,レシーバ,リクエスタ,またはクラスタレシーバです。
この図中のAの場合,およびBの場合の送信側MCAと受信側MCAの動作を次の表に示します。
リセット実行の有無※1 |
チャネル確立後の送受信メッセージの種別 |
図中のAの場合 |
||
---|---|---|---|---|
送信側MCA |
受信側MCA |
送信側MCAの動作 |
受信側MCAの動作 |
|
○ |
× |
すべてファーストメッセージ※2 |
|
|
ファーストメッセージ以外を含む※3 |
||||
○ |
○ |
すべてファーストメッセージ※2 |
|
|
ファーストメッセージ以外を含む※3 |
||||
× |
× |
すべてファーストメッセージ※2 |
|
|
ファーストメッセージ以外を含む※3 |
||||
× |
○ |
すべてファーストメッセージ※2 |
|
|
ファーストメッセージ以外を含む※3 |
- (凡例)
-
○:リセットを実行している。
×:リセットを実行していない。
- 注※1
-
リセットコマンドは,チャネル確立前(図中のAの前)に実行します。
- 注※2
-
チャネルがファーストメッセージ機能を使用し,かつすべてファーストメッセージである場合に該当します。
- 注※3
-
次のどちらかの場合に該当します。
・チャネルがファーストメッセージ機能を使用していない場合。
・チャネルがファーストメッセージ機能を使用し,かつ一つ以上の通常メッセージが含まれている場合。
- 注※4
-
チャネルがファーストメッセージ機能を使用している場合,通常メッセージだけが該当します。
リセット実行の有無※1 |
チャネル確立後の送受信メッセージの種別 |
図中のBの場合 |
||
---|---|---|---|---|
送信側MCA |
受信側MCA |
送信側MCAの動作 |
受信側MCAの動作 |
|
○ |
× |
すべてファーストメッセージ※2 |
|
|
ファーストメッセージ以外を含む※3 |
|
|
||
○ |
○ |
すべてファーストメッセージ※2 |
|
|
ファーストメッセージ以外を含む※3 |
|
|||
× |
× |
すべてファーストメッセージ※2 |
|
|
ファーストメッセージ以外を含む※3 |
||||
× |
○ |
すべてファーストメッセージ※2 |
|
|
ファーストメッセージ以外を含む※3 |
|
- (凡例)
-
○:リセットを実行している。
×:リセットを実行していない。
- 注※1
-
リセットコマンドは,チャネル確立前(図中のAの前)に実行します。
- 注※2
-
チャネルがファーストメッセージ機能を使用し,かつすべてファーストメッセージである場合に該当します。
- 注※3
-
次のどちらかの場合に該当します。
・チャネルがファーストメッセージ機能を使用していない場合。
・チャネルがファーストメッセージ機能を使用し,かつ一つ以上の通常メッセージが含まれている場合。
- 注※4
-
チャネルがファーストメッセージ機能を使用している場合,通常メッセージだけが該当します。
(3) 送信側MCAと受信側MCAのメッセージシーケンス番号の扱い
メッセージシーケンス番号の扱いについて,送信側MCAと受信側MCAに分けて説明します。
(a) 送信側MCAの場合
- 転送キューのメッセージ
-
コネクション障害またはオンラインシステムの停止などでメッセージの送信が中断された場合,転送キュー内のメッセージは次のように処理されます。
-
障害回復後の状態が「メッセージ送達未確認=YES」の場合
LUWIDとメッセージシーケンス番号を基に,転送キュー内のメッセージを再送します。ただし,受信側のシステムでメッセージが受信済みになっているときは,送信側で転送キュー内のメッセージを削除します。
-
障害回復後の状態が「メッセージ送達未確認=NO」の場合
転送キュー内のメッセージを再送します。
メッセージ送達未確認については,mqtlschaコマンドを実行して出力されるチャネルの状態の「メッセージ送達未確認=iii」で確認できます。
-
(b) 受信側MCAの場合
- 直前のメッセージと同じメッセージシーケンス番号のメッセージが発生した場合
-
あとから発生したメッセージを破棄し,処理を続けます。
- メッセージシーケンス番号が不正の場合(番号が飛ばされた場合など)
-
メッセージシーケンス番号不一致として,チャネルを解放します。
(4) メッセージシーケンス番号不一致の原因と対処方法
メッセージシーケンス番号不一致が発生した場合,KFCA16343-Eメッセージが出力されます。この原因と対処方法について次の表に示します。
メッセージシーケンス番号不一致の発生個所 |
原因 |
対処方法 |
---|---|---|
送信側MCA |
|
mqtrstchaコマンドでリセットしてください。受信側も同じリセット値でリセットされます。 |
受信側MCA |
|
送信側のシーケンス番号に合わせて,mqtrstchaコマンドでリセットしてください。 ただし,送信側でもリセットされていた場合,送信側のリセット値が受信側でも有効になります。 |
- 注※1
-
チャネルがファーストメッセージ機能を使用している場合,通常メッセージだけが該当します。
- 注※2
-
送信側の開始後,チャネル確立前にメッセージシーケンス番号のリセットが行われている場合は除きます。詳細については,「(2) リセットコマンド実行後のチャネルの動作」を参照してください。
(5) メッセージの送達未確認状態
メッセージの送受信中に通信障害,チャネル停止,またはTP1/Message Queueが異常終了すると,処理中のメッセージが送信先に届いたかどうかが確認できなくなります。そういう状態を,メッセージの送達未確認状態といいます。
メッセージの送達未確認状態には,次に示す場合があります。
- あて先キューへ登録済み
-
転送中だったメッセージが送信側の転送キューと受信側のあて先キューの両方に登録されている状態
- あて先キューへ未登録
-
転送中だったメッセージが送信側の転送キューに残り,あて先キューには登録されていない状態
チャネルの再開始を要求すると,メッセージの送達未確認状態は解決され,処理を続行できます。ただし,正常開始後にチャネルの再開始を要求する場合は,「(6) 正常開始する場合の準備」を参照してください。
(6) 正常開始する場合の準備
OpenTP1システムを正常開始する場合で,チャネル管理情報格納ファイルを使用しないとき,メッセージの送達未確認状態およびメッセージシーケンス番号の以前の状態は引き継がれません。そこで,メッセージシーケンス番号を管理するために,正常開始を要求する前に次に示す手順で準備をしてください。
(a) メッセージの送達未確認状態の解決
チャネル情報引き継ぎ機能を使用しない場合,チャネル情報を引き継がない条件※に該当する場合,または送信側MCAが送達未確認状態の場合,メッセージを二重送信することがあります。次に示す手順をオンライン中に実行して,この問題点を解決してください。メッセージの送達未確認状態での問題点を解決できます。
-
mqtlschaコマンドを使用して,送信側MCAでメッセージが送達未確認状態であるかどうかを確認します。送達未確認状態の場合,2.以下の処理を続けてください。
-
mqtlschaコマンドを使用して,送信側MCAの送信仕掛かりメッセージシーケンス番号を確認します。
-
mqtlschaコマンドを使用して,受信完了したメッセージシーケンス番号を確認します。
-
mqtrlvchaコマンドを使用して,メッセージ送達未確認状態の問題点を解決します。
- <2.と3.のシーケンス番号が一致していた場合>
-
mqtrlvchaコマンドの-aオプションにcommitを指定してください。仕掛かり中のメッセージをコミットして有効にします。
- <2.と3.のシーケンス番号が不一致だった場合>
-
mqtrlvchaコマンドの-aオプションにbackoutを指定してください。仕掛かり中のメッセージをロールバックして無効にします。
- 注※
-
チャネル情報を引き継がない条件については,「5.3.2 チャネル情報を引き継がない条件」を参照してください。
(7) 二重受信メッセージの破棄
TP1/Message Queueでは,受信側でメッセージの二重受信を検出して,メッセージを破棄する機能を持っています。
次に示す四つの条件を同時に満たす場合,KFCA16348-Wのメッセージを出力して,受信したメッセージを破棄します。
-
受信側チャネルで覚えている前回受信したメッセージのシーケンス番号と受信メッセージのシーケンス番号が一致する。
-
自システムまたは相手システムのどちらかのバッチサイズが1である。
-
メッセージシーケンス番号がリセットされていない。
-
自システムまたは相手システムのどちらかが,FAPレベル1で動作している。
なお,動作するFAPレベルと製品のバージョンとの対応を次に示します。
-
FAPレベル1:TP1/Message Queue 01-xx※1
-
FAPレベル4:TP1/Message Queue 05-xx※1,06-xx※1,07-00,07-01,および07-5x※2
- 注※1
-
xxには,任意の符号なし整数が入ります。
- 注※2
-
5xのxには,任意の符号なし整数が入ります。
その他のMQシステムが動作するFAPレベルについては,使用するMQシステムが提供するマニュアルを参照してください。