0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-10-23

この記事で調べたこと

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

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

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

目次

1.優先度
2.MQMD構造体フィールド
3.トランザクション
4.参考

1. 優先度

MQMQ構造体 Priorityフィールドによる指定

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

  1. MQMD構造体

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

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

      3. (補足)

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

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

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

2. MQMD構造体フィールド

よく使いそうなフィールドだけ太字で強調。

  1. StrucId 構造体 ID

  2. Version 構造体のバージョン番号

  3. Report レポート・メッセージのオプション

  4. MsgType メッセージ・タイプ

  5. Expiry メッセージ存続時間

  6. Feedback フィードバックまたは理由コード

  7. Encoding メッセージ・データの数値エンコード

  8. CodedCharSetId メッセージ・データの文字セット ID

  9. Format メッセージ・データの形式名

  10. Priority メッセージ優先度

  11. Persistence メッセージの持続性

  12. MsgId メッセージ ID

  13. CorrelId 相関 ID

  14. BackoutCount バックアウトのカウンター

    MQGET 呼び出しから事前に戻されて、その後バックアウトされた回数のカウント
    MQGET 呼び出しの出力フィールドです。MQPUT および MQPUT1 呼び出しでは、無視されます。 このフィールドの初期値は 0 です。
    IBM Documantation

  15. ReplyToQ 応答キューの名前

  16. ReplyToQMgr 応答キュー・マネージャーの名前

  17. UserIdentifier ユーザー ID

  18. AccountingToken アカウンティング・トークン

  19. ApplIdentityData ID に関連するアプリケーション・データ

  20. PutApplType メッセージを書き込んだアプリケーションのタイプ

  21. PutApplName メッセージを書き込んだアプリケーションの名前

  22. PutDate メッセージを書き込んだ日付

  23. PutTime メッセージを書き込んだ時刻

  24. ApplOriginData 発生元に関係するアプリケーション・データ

  25. *下記は MQMD_VERSION_2 で追加されたフィールドです。

  26. GroupId グループ ID

  27. MsgSeqNumber グループ中の論理メッセージの順序番号

  28. Offset 物理メッセージのデータの、論理メッセージの開始点からの相対位置

  29. MsgFlags メッセージ・フラグ

  30. OriginalLength 元のメッセージの長さ

3. トランザクション

  1. コミットとバックアウト

    1. 原則PUTもGETもトランザクションが貼られて、COMMITするまでキューの中にメッセージは残る。
    2. またトランザクション中他のアプリはメッセージを取得することができない。
    3. PUTもGETも何らかの理由によりバックアウト(ロールバックのこと?)されると、他のアプリによりメッセージを取得できる。

    プログラムが作業単位内でメッセージをキューに書き込むとき、そのメッセージは、プログラムがその作業単位をコミットするまで他のプログラムには
    見えません。作業単位をコミットするには、データの安全性を保護するためにすべての更新処理が正常終了する必要があります。プログラムがエラ
    ーを検出して、PUT 操作を永続的にしないと判断した場合、その作業単位をバックアウトできます。プログラムがバックアウトを行うと、IBM
    WebSphere MQ はその作業単位によってキューに書き込まれたメッセージを除去することにより、キューを復元します。プログラムがコミットやバッ
    クアウト操作を実行する方法は、プログラムが実行されている環境に依存します。
    同様に、プログラムが作業単位内でキューからメッセージを読み取ったときも、そのメッセージは、プログラムがその作業単位をコミットするまでキュ
    ーに残っています。ただし、そのメッセージを他のプログラムが取り出すことはできません。そのメッセージは、プログラムが作業単位をコミットしたと
    きに、キューから永続的に削除されます。プログラムが作業単位をバックアウトすると、IBM WebSphere MQ は、メッセージが他のプログラムによ
    って検索できるようにすることによって、キューを復元します。
    IBM Documantation

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

4. 参考

実機で優先度を検証されている神サイト

IBM Document キュー属性

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0