MQ個人的メモ(優先順位・トランザクション)

# この記事で調べたこと
MQメッセージはどうやらPUTした順番でGETされるだけではなく（所謂FIFO）、優先順位を設定してGETできることを業務を通して知った。
また、１メッセージ１コミットorロールバックと思い込んでいたがどうやらそうではないよう。

気になったので調べてみた。

🚨タイトルにある通り個人的メモです。

# 目次
[1.優先度](#1-優先度)
[2.MQMD構造体フィールド](#2-MQMD構造体フィールド)
[3.トランザクション](#3-トランザクション)
[4.参考](#4-参考)



# 1. 優先度
## MQMQ構造体 Priorityフィールドによる指定
MQMD構造体のPriorityフィールドによる指定と、キューのDEFPRTYの設定で優先順位を設定できる。

1. **MQMD構造体**
    1. Priorityフィールド
       1. MQPRI_PRIORITY_AS_Q_DEF(デフォルト）
          キューのDEFPRTYで設定されている値(デフォルト値は'0')が設定される。

       1. 0...9 数値指定
          0...0 で設定した値が設定される。

       1. (補足)
          1. 優先順位は0...9で数値が大きい方が優先度が高い。
          1. 最高優先順位は'9'でキューマネージャのMAXPRTYで定義されており、このプロパティは固定で変更できない。

1. **キュー**
    1. MSGDLVSQ
       1. PRIORITY
          MQGET API呼び出しによるメッセージの配布は、優先順位内の先入れ先出し（FIFO)順序で行われる。

       1. FIFO
          MQGET API 呼び出しによるメッセージの配布は、FIFO 順で行われます。このキューのメッセージについては、優先順位が無視される。

# 2. MQMD構造体フィールド
よく使いそうなフィールドだけ太字で強調。

1. StrucId	構造体 ID
1. Version	構造体のバージョン番号
1. Report	レポート・メッセージのオプション
1. MsgType	メッセージ・タイプ
1. Expiry	メッセージ存続時間
1. Feedback	フィードバックまたは理由コード
1. Encoding	メッセージ・データの数値エンコード
1. CodedCharSetId	メッセージ・データの文字セット ID
1. Format	メッセージ・データの形式名
1. Priority	メッセージ優先度
1. Persistence	メッセージの持続性
1. **MsgId	メッセージ ID**
1. CorrelId	相関 ID
1. **BackoutCount	バックアウトのカウンター** 
   >MQGET 呼び出しから事前に戻されて、その後バックアウトされた回数のカウント
   >MQGET 呼び出しの出力フィールドです。MQPUT および MQPUT1 呼び出しでは、無視されます。 このフィールドの初期値は 0 です。
   >[IBM Documantation](https://www.ibm.com/docs/ja/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mq-ref-dev-doc-q097450--htm)
   


1. ReplyToQ	応答キューの名前
1. ReplyToQMgr	応答キュー・マネージャーの名前
1. UserIdentifier	ユーザー ID
1. AccountingToken	アカウンティング・トークン
1. ApplIdentityData	ID に関連するアプリケーション・データ
1. PutApplType	メッセージを書き込んだアプリケーションのタイプ
1. PutApplName	メッセージを書き込んだアプリケーションの名前
1. PutDate	メッセージを書き込んだ日付
1. PutTime	メッセージを書き込んだ時刻
1. ApplOriginData	発生元に関係するアプリケーション・データ
1. *下記は MQMD_VERSION_2 で追加されたフィールドです。
1. GroupId	グループ ID
1. MsgSeqNumber	グループ中の論理メッセージの順序番号
1. Offset	物理メッセージのデータの、論理メッセージの開始点からの相対位置
1. MsgFlags	メッセージ・フラグ
1. OriginalLength	元のメッセージの長さ

# 3. トランザクション
1. **コミットとバックアウト**
    1. **原則**PUTもGETもトランザクションが貼られて、COMMITするまでキューの中にメッセージは残る。
    1. またトランザクション中他のアプリはメッセージを取得することができない。
    1. PUTもGETも何らかの理由によりバックアウト（ロールバックのこと?)されると、他のアプリによりメッセージを取得できる。
    >プログラムが作業単位内でメッセージをキューに書き込むとき、そのメッセージは、プログラムがその作業単位をコミットするまで他のプログラムには 
     見えません。作業単位をコミットするには、データの安全性を保護するためにすべての更新処理が正常終了する必要があります。プログラムがエラ 
     ーを検出して、PUT 操作を永続的にしないと判断した場合、その作業単位をバックアウトできます。プログラムがバックアウトを行うと、IBM 
     WebSphere MQ はその作業単位によってキューに書き込まれたメッセージを除去することにより、キューを復元します。プログラムがコミットやバッ 
     クアウト操作を実行する方法は、プログラムが実行されている環境に依存します。
     同様に、プログラムが作業単位内でキューからメッセージを読み取ったときも、そのメッセージは、プログラムがその作業単位をコミットするまでキュ 
     ーに残っています。ただし、そのメッセージを他のプログラムが取り出すことはできません。そのメッセージは、プログラムが作業単位をコミットしたと 
     きに、キューから永続的に削除されます。プログラムが作業単位をバックアウトすると、IBM WebSphere MQ は、メッセージが他のプログラムによ 
     って検索できるようにすることによって、キューを復元します。
     [IBM Documantation](https://www.ibm.com/docs/ja/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mq-dev-doc-q026790--htm)

2. **実装イメージ**
日立のサイトがイメージしやすい。

https://itpfdoc.hitachi.co.jp/manuals/3000/30003D9410/MQAC0039.HTM


# 4. 参考
実機で優先度を検証されている神サイト

https://www.pulsarintegration.jp/MQBasic/MQBasic2.html

IBM Document キュー属性

https://www.ibm.com/docs/ja/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mq-ref-adm-doc-q085690--htm#q085690___initq

IBM Document メッセージ優先順位の説明

https://www.ibm.com/docs/ja/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mq-dev-doc-q022920--htm