理系学生日記

おまえはいつまで学生気分なのか

Websphere MQ における MQMD.version について

WebSphere MQ を勉強しているのですが謎が多い。Websphere MQ 経由でシステム間連携を行う際にどうすれば良いのかについては、かなりややこしい話題がたくさんなので、気付きをまとめていきたいと思います。今日は MQMD の Version について。

** MQMD とは 公式マニュアル的には以下の通りなのですが、MQ 力の低いぼくにとってはクソみたいに分かりづらいので補足します。

MQMD の概要> 目的: MQMD 構造体には、送信側アプリケーションと受信側アプリケーションとの間でメッセージがやり取りされるとき、アプリケーション・データに付随する制御情報が入れられます。 この構造体は、MQGET、MQPUT、および MQPUT1 呼び出しに指定する入出力パラメーターです。 << MQMD というのは、言ってみれば MQ 上のメッセージの持つヘッダのようなもので、Websphere MQ 側で定められています。WebSphere MQ Message Descriptor の略。 MQMD の持つ具体的なフィールドとしては、以下のマニュアルに記述があります。 - MQMD - メッセージ記述子 今回のエントリのテーマは、この中の "Version" フィールド。

** Version フィールド

Version フィールドは、MQMD に含まれるデータが将来増えた場合に、バージョンの値を増やすことで上位互換性を維持するために設けられたフィールドです。 2015/11 時点では、バージョン 1 (MQMD_VERSION_1) とバージョン 2 (MQMD_VERSION_2) を指定することができます。バージョン 2 からは、MQMD に対して GroupId、MsgSegNumber、Offset、MsgFlags、OriginalLength というフィールドが追加されています。これらを用いて、バージョン 2 からはグループ化、セグメント化に対応しています。これは、どちらも大きなデータを複数のメッセージに分割して送信できるという機能ですが、今回は割愛。詳細については、下記の参考セクションを参照してくれ。

問題は、MQ を介して連携を行う 2 システムの一方が MQMD.version に MQMD_VERSION_1 をセットし、他方が当該メッセージを MQMD_VERSION_2 として受信する場合に、果たして連携ができるのか、という話になります。 結論としては「おそらくできる」なのですが、「おそらくできる」ためには、双方のシステムが version が混在することを見越した実装をする必要がありそうです。

** MQMDE MQMD の拡張用の構造体として、MQMDE (拡張メッセージ記述子) というものが存在しています。この MQMDE が持つフィールドは、「バージョン 2 の MQMD には存在しているが、バージョン 1 の MQMD には存在していない」フィールド群。つまり、バージョン 2 で新しく増えたフィールドが MQMDE のフィールドとして定義されているわけですね。 例えば、送信側がバージョン 1 を指定した上でメッセージを送信する場合、アプリケーションは MQMDE があること、および、実際の MQMDE の値を指定することで、バージョン 1 であるにも関わらず、バージョン 2 で定義されたフィールドの情報を宛先システムに送信することができます。当然、宛先システムがこれを読み出す際は、MQMDE が存在することを意識して読み出す必要があるはずです。

** 結論 ということなので、送信側と宛先システムが使用するバージョンについては、きちんと合わせて通信した方が楽ですね、というお話でした。

** 参考 - Version (MQLONG) - GitHub - IBM/japan-technology: IBM Related Japanese technical documents - Code Patterns, Learning Path, Tutorials, etc. - http://public.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/2.pdf