WebSphere MQ: 分散キューイング (1) Sender, Receiver

WebSphere MQにおける異なるシステム間でのメッセージの送受信機能について確認する。前回までの記事はこちら。参考ドキュメントは記事の末尾をご参照。

分散キューイングの構成

※画像はクリックすると拡大します。
websphere_mq_remote
上図はキュー・マネージャーQMC→QMWへのメッセージ送信時の各オブジェクトの定義例と必要要素を図示したもの。上図のメッセージ・フローは一方通行だが、下記のサンプルはQMC, QMWにSender, Receiverの双方を作成して、両キュー・マネージャー間のメッセージ通信機能を確認する。

接続オブジェクトの定義 – QMC側

本来であれば、QMC, QMWはそれぞれ別のシステム上に設置されて通信させるものだが、今回は検証環境の都合上、同システム上に2つのキュー・マネージャーを定義して通信をさせる。先ずはQMCというキュー・マネージャーを定義しSTARTさせる。その後、サンプル・プログラムを使用するための初期設定スクリプトを実行する。

$ crtmqm QMC
$ strmqm QMC
$ runmqsc QMC < /opt/mqm/samp/amqscos0.tst

続けて、送信・受信チャネル、トランスミッション・キュー、リモート・キュー定義、及びDead-Letterキューを作成する。

$ vi exe3.txt
DEF CHL(QMC.QMW) CHLTYPE(SDR) REPLACE +
TRPTYPE(TCP) +
CONNAME('127.0.0.1(1414)') +
XMITQ(QMW) PROPCTL(NONE)
DEF CHL(QMW.QMC) CHLTYPE(RCVR) REPLACE TRPTYPE(TCP)
DEF QL(QMW) REPLACE USAGE(XMITQ)
DEF QL(DLQ) REPLACE
ALTER QMGR DEADQ(DLQ)
DEF QL(QL.A) REPLACE
DEF QR(QRMT.A) REPLACE +
RNAME(QL.A) RQMNAME(QMW) +
XMITQ(QMW)
$ runmqsc QMC < exe3.txt

接続オブジェクトの定義 - QMW側

QMC側と同様にキュー・マネージャーと接続オブジェクトを定義する。

$ crtmqm QMW
$ strmqm QMW
$ runmqsc QMW < /opt/mqm/samp/amqscos0.tst
$ vi exe3w.txt
DEF CHL(QMW.QMC) CHLTYPE(SDR) REPLACE +
TRPTYPE(TCP) +
CONNAME('127.0.0.1(4141)') +
XMITQ(QMC) PROPCTL(NONE)
DEF CHL(QMC.QMW) CHLTYPE(RCVR) REPLACE TRPTYPE(TCP)
DEF QL(QMC) REPLACE USAGE(XMITQ)
DEF QL(DLQ) REPLACE
ALTER QMGR DEADQ(DLQ)
DEF QL(QL.A) REPLACE
DEF QR(QRMT.A) REPLACE +
RNAME(QL.A) RQMNAME(QMC) +
XMITQ(QMC)
$ runmqsc QMW < exe3w.txt

接続テスト

双方のコマンドプロンプトで所定のポートをlistenするリスナーを起動する。

QMC側

runmqlsr -t TCP -p 4141 -m QMC

QMW側

runmqlsr -t TCP -p 1414 -m QMW

双方からrunmqscコマンド・インターフェイス上のMQ PINGを実施しチャネル定義を確認する。

QMC側

ping chl(QMC.QMW)
     1 : ping chl(QMC.QMW)
AMQ8020: Ping WebSphere MQ channel complete.
start chl(QMC.QMW)
     2 : start chl(QMC.QMW)
AMQ8018: Start WebSphere MQ channel accepted.

QMW側

ping chl(QMW.QMC)
     1 : ping chl(QMW.QMC)
AMQ8020: Ping WebSphere MQ channel complete.
start chl(QMW.QMC)
     2 : start chl(QMW.QMC)
AMQ8018: Start WebSphere MQ channel accepted.

メッセージのput

試しにQMC→QMWへのメッセージのputをする。

$ amqsput QRMT.A QMC
Sample AMQSPUT0 start
target queue is QRMT.A
I send a message from QMC.
Sample AMQSPUT0 end
$ amqsbcg QL.A QMW
AMQSBCG0 - starts here
**********************
 MQOPEN - 'QL.A'
 MQGET of message number 1
****Message descriptor****
  StrucId  : 'MD  '  Version : 2
  Report   : 0  MsgType : 8
  Expiry   : -1  Feedback : 0
  Encoding : 546  CodedCharSetId : 819
  Format : 'MQSTR   '
  Priority : 0  Persistence : 0
  MsgId : X'414D5120514D432020202020202020209093F25002350020'
  CorrelId : X'000000000000000000000000000000000000000000000000'
  BackoutCount : 0
  ReplyToQ       : '                                                '
  ReplyToQMgr    : 'QMC                                             '
  ** Identity Context
  UserIdentifier : 'mqm         '
  AccountingToken :
   X'0334393600000000000000000000000000000000000000000000000000000006'
  ApplIdentityData : '                                '
  ** Origin Context
  PutApplType    : '6'
  PutApplName    : 'amqsput                     '
  PutDate  : '20130113'    PutTime  : '11370619'
  ApplOriginData : '    '
  GroupId : X'000000000000000000000000000000000000000000000000'
  MsgSeqNumber   : '1'
  Offset         : '0'
  MsgFlags       : '0'
  OriginalLength : '-1'
****   Message      ****
 length - 26 bytes
00000000:  4920 7365 6E64 2061 206D 6573 7361 6765 'I send a message'
00000010:  2066 726F 6D20 514D 432E                ' from QMC.      '
 No more messages
 MQCLOSE
 MQDISC
$

正常にメッセージが送信されていることを確認できた。続いてQMW→QMCへのメッセージの送信確認をする。

$ amqsget QL.A QMW
Sample AMQSGET0 start
message 
no more messages
Sample AMQSGET0 end
$
$ amqsput QRMT.A QMW
Sample AMQSPUT0 start
target queue is QRMT.A
I send a message from QMW
Sample AMQSPUT0 end
$ amqsget QL.A QMC
Sample AMQSGET0 start
message 
no more messages
Sample AMQSGET0 end
$

確かに送信できていることを確認できた。

参考文献