この記事で調べたこと
MQメッセージはどうやらPUTした順番でGETされるだけではなく(所謂FIFO)、優先順位を設定してGETできることを業務を通して知った。
また、1メッセージ1コミットorロールバックと思い込んでいたがどうやらそうではないよう。
気になったので調べてみた。
🚨タイトルにある通り個人的メモです。
目次
1.優先度
2.MQMD構造体フィールド
3.トランザクション
4.参考
1. 優先度
MQMQ構造体 Priorityフィールドによる指定
MQMD構造体のPriorityフィールドによる指定と、キューのDEFPRTYの設定で優先順位を設定できる。
-
MQMD構造体
- Priorityフィールド
-
MQPRI_PRIORITY_AS_Q_DEF(デフォルト)
キューのDEFPRTYで設定されている値(デフォルト値は'0')が設定される。 -
0...9 数値指定
0...0 で設定した値が設定される。 -
(補足)
- 優先順位は0...9で数値が大きい方が優先度が高い。
- 最高優先順位は'9'でキューマネージャのMAXPRTYで定義されており、このプロパティは固定で変更できない。
-
- Priorityフィールド
-
キュー
- MSGDLVSQ
-
PRIORITY
MQGET API呼び出しによるメッセージの配布は、優先順位内の先入れ先出し(FIFO)順序で行われる。 -
FIFO
MQGET API 呼び出しによるメッセージの配布は、FIFO 順で行われます。このキューのメッセージについては、優先順位が無視される。
-
- MSGDLVSQ
2. MQMD構造体フィールド
よく使いそうなフィールドだけ太字で強調。
-
StrucId 構造体 ID
-
Version 構造体のバージョン番号
-
Report レポート・メッセージのオプション
-
MsgType メッセージ・タイプ
-
Expiry メッセージ存続時間
-
Feedback フィードバックまたは理由コード
-
Encoding メッセージ・データの数値エンコード
-
CodedCharSetId メッセージ・データの文字セット ID
-
Format メッセージ・データの形式名
-
Priority メッセージ優先度
-
Persistence メッセージの持続性
-
MsgId メッセージ ID
-
CorrelId 相関 ID
-
BackoutCount バックアウトのカウンター
MQGET 呼び出しから事前に戻されて、その後バックアウトされた回数のカウント
MQGET 呼び出しの出力フィールドです。MQPUT および MQPUT1 呼び出しでは、無視されます。 このフィールドの初期値は 0 です。
IBM Documantation -
ReplyToQ 応答キューの名前
-
ReplyToQMgr 応答キュー・マネージャーの名前
-
UserIdentifier ユーザー ID
-
AccountingToken アカウンティング・トークン
-
ApplIdentityData ID に関連するアプリケーション・データ
-
PutApplType メッセージを書き込んだアプリケーションのタイプ
-
PutApplName メッセージを書き込んだアプリケーションの名前
-
PutDate メッセージを書き込んだ日付
-
PutTime メッセージを書き込んだ時刻
-
ApplOriginData 発生元に関係するアプリケーション・データ
-
*下記は MQMD_VERSION_2 で追加されたフィールドです。
-
GroupId グループ ID
-
MsgSeqNumber グループ中の論理メッセージの順序番号
-
Offset 物理メッセージのデータの、論理メッセージの開始点からの相対位置
-
MsgFlags メッセージ・フラグ
-
OriginalLength 元のメッセージの長さ
3. トランザクション
-
コミットとバックアウト
- 原則PUTもGETもトランザクションが貼られて、COMMITするまでキューの中にメッセージは残る。
- またトランザクション中他のアプリはメッセージを取得することができない。
- PUTもGETも何らかの理由によりバックアウト(ロールバックのこと?)されると、他のアプリによりメッセージを取得できる。
プログラムが作業単位内でメッセージをキューに書き込むとき、そのメッセージは、プログラムがその作業単位をコミットするまで他のプログラムには
見えません。作業単位をコミットするには、データの安全性を保護するためにすべての更新処理が正常終了する必要があります。プログラムがエラ
ーを検出して、PUT 操作を永続的にしないと判断した場合、その作業単位をバックアウトできます。プログラムがバックアウトを行うと、IBM
WebSphere MQ はその作業単位によってキューに書き込まれたメッセージを除去することにより、キューを復元します。プログラムがコミットやバッ
クアウト操作を実行する方法は、プログラムが実行されている環境に依存します。
同様に、プログラムが作業単位内でキューからメッセージを読み取ったときも、そのメッセージは、プログラムがその作業単位をコミットするまでキュ
ーに残っています。ただし、そのメッセージを他のプログラムが取り出すことはできません。そのメッセージは、プログラムが作業単位をコミットしたと
きに、キューから永続的に削除されます。プログラムが作業単位をバックアウトすると、IBM WebSphere MQ は、メッセージが他のプログラムによ
って検索できるようにすることによって、キューを復元します。
IBM Documantation -
実装イメージ
日立のサイトがイメージしやすい。
4. 参考
実機で優先度を検証されている神サイト
IBM Document キュー属性
IBM Document メッセージ優先順位の説明