WebSphere MQ なんて聞いたこともなかったんだけど、なんかまぁ特定エリアではよく使われているらしい。 以下、WebSphere MQ と RabbitMQ とかと比較するのは比較軸としてふさわしくない気がしないでもないけど、Google Trends の結果としては以下のようなかんじ。
まぁそんな製品を勉強しなければならない状況は変わっていないので、いろいろと調べてみてる。 今読んでいるのは WebSphere MQ V6 Fundamentals。これを読んだら、全体感は掴めそうな気がする。
MQMD
個々の MQ メッセージに付与されるヘッダ。WebSphere MQ Message Descriptor の略。 代表的なヘッダフィールドには以下のようなものがある。
MsgType
: レスポンスを不要とするメッセージであることを示すdatagram
や、リクエストとそれに対する返信を示すrequest
とreply
、あるいはreport
など、メッセージの種別を示す。Report
: 通信先のシステム (キューマネージャ、あるいは、アプリケーション) にreport
の返信を要求することを示す。ReplyToQ
: 通信先のシステムに対し、「どのキューに」reply
あるいはreport
を返信してほしいのかを示す。ReplyToQMgr
:ReplyToQ
をホストしているキューマネージャ名を示す。通常、WebSphere MQ は、MQ メッセージが最初に PUT されたキューマネージャ名をこのフィールドに自動で書き込む。アプリケーションでの書き換えは可能。MsgId
: 名前のとおり、MQ メッセージの ID。アプリケーションが明示的に指定することも、WebSphere MQ に自動で生成させることも可能。CorrelId
: メッセージとメッセージの関連付けるフィールド。通常は、reply
MQ メッセージのCorrelId
フィールドにrequest
MQ メッセージのメッセージ ID を格納することで、request
-reply
の対を関連付ける。Persistence
: MQ メッセージの永続性を示す。CodedCharSetId
: MQ の文脈では CCSID とも呼ばれ、文字コードセットの ID を示す。Web Sphere MQ はこの値を元にして、データを文字に変換することが「できる」 (変換可否はFormat
に依存し、例えばバイナリデータは変換不可)Encoding
: 数値データのエンディアンを示すExpiry
: メッセージの生存時間の指定で、1/10 秒単位で指定する。これを超えた MQ メッセージは、次に WebSphere MQ 内で参照 (原文的には "when an attempt is made to retrive or view them by an application") されたタイミングで削除される。WebSphere MQ V6.0 からは "expiry task" というのがあり、定期的にこういうメッセージを削除してくれるらしい。
Expiry については、後の参考文献に示すとおり Legacy Communities - IBM Community に気になる情報がある。Web Sphere MQ V6.0 以上の場合は内部に expiry task が存在しており、5 分毎に消してくれるらしい。コメント欄には以下の既述がある。
By default, the internal expirer task runs every 300 seconds (5 minutes). Lowering the frequency to every second could impact performance depending on your overall configuration (number of queues, etc).
MQI
MQI っていうのは、WebSphere MQ を使用した手続型のメッセージングインタフェースのことで、Message Queue Interface の略。全部で 13 の関数が定義されている。 Java や C++ のようなオブジェクト指向言語で直接使用するわけではないが、JMS 等の実装の中ではこの MQI が使われている。
MQCONN
/MQCONNX
WebSphere MQ のキューマネージャとのコネクションを確立するためのインタフェース。MQCONNX
は、単純に MQCONN
よりも渡せる引数が多くなっているだけ。
成功すると、HConn
と呼ばれるコネクションのハンドルを返却する。
MQOPEN
"Connected" な状態になったキューマネージャ上のオブジェクト (Queue を含む) にアクセスするためのインタフェース。ちなみに、キューを開く場合は、Object Descriptor (MQOD
) とキュー名とともに、キューマネージャも渡すことで、ローカルキューマネージャが知っている別のキューマネージャに送ることもできる。
MQOPEN
が成功した場合は、Hobj
と呼ばれるオブジェクトハンドルを返却する。
MQCLOSE
まぁ閉じるんでしょう。あれを。
MQPUT
Open したキューに対し、名前の通りメッセージを PUT
する。この MQPUT
は、アプリケーションが接続しているキューマネージャ上のキューにメッセージを PUT できるまでブロックする。
ちなみに、Open したキューが「別のキューマネージャ上のキュー」である場合は、ローカルキューマネージャ上のトランスミッションキューに PUT できた時点で制御が戻ることになる。
MQPUT
には MQMD
とともに、MQPUT
の振舞を定める MQPMO
(PUT Message Options Structure) を渡すことができる。典型的には、syncpoint
(MQ の文脈でいうトランザクション) を使うか否かを制御できる。
MQPUT1
クソみたいに名前がわかりにくいけど、このインタフェースは既述の MQOPEN
、MQPUT
、MQCLOSE
を行う。便利なだけでなく、効率も良い。
MQGET
これは MQGET
とは逆に、Open したキューから、名前の通りメッセージを GET
する。MQGET
の振舞いは MQGMO
(Get Message Options Structure) で指定でき、GET したメッセージをキューから消すか残すか、どういう基準でメッセージを選択するか (CorrelId
指定とか) などを既述できる。
MQBEGIN
/MQCMIT
/MQBACK
WebSphere MQ には、DBMS 等の外部リソースを巻き込んだトランザクションの概念として global unit of work
がある。このトランザクションを開始するのが MQBEGIN
。MQCMIT
、あるいは MQBACK
で終了する。
MQINC
/MQSET
あんまり使わないかと思うので今のところ興味がないんだけど、open したオブジェクトの属性を参照するのが MQINC
、設定するのが MQSET
。
MQDISK
キューマネージャとアプリケーションとの接続を切断する。MQCONN
あるいは MQCONNX
の逆操作。
MQDISK
が呼び出されないままアプリケーションが終了し、それをキューマネージャが検知すると、キューマネージャは MQBACK
をコールしてロールバックを行い、コネクションを切断する。