ngtokuの日記

主に雑記帳です。SNSではngtokuのID取れなかったんで、別のIDでやってます。

MQの簡単ヘルスチェック(ローカル)

某社でMQ担当の設定やオペレーションのミスがあまりにも多くて「設定後やサーバの再起動後にヘルスチェックやってないの?」と聞いてみたら「MQにそんな手段は存在しない。プログラムの側で確認して貰うしかない。」と返してきたので「本当かいな?」と思い確認してみた時の記録。
1〜2は環境構築なので、実際に行う手順は3のみ。4は異常時の確認。

1.IBMのDockerイメージから環境構築

作業環境にdockerが入っていないかったので、そこから。

# yum -y install docker-io
# service docker start
# git clone https://github.com/ibm-messaging/mq-docker

ただそのままだと確認用プログラム(MQSeriesSamples)とリモート確認用ライブラリ(MQSeriesClient)が入っていないので、Dockerfile編集。

# cd mq-docker
# vi server/Dockerfile

変更前
ARG MQ_PACKAGES="MQSeriesRuntime-*.rpm MQSeriesServer-*.rpm MQSeriesMsg*.rpm MQSeriesJava*.rpm MQSeriesJRE*.rpm MQSeriesGSKit*.rpm"
変更後
ARG MQ_PACKAGES="MQSeriesRuntime-*.rpm MQSeriesServer-*.rpm MQSeriesMsg*.rpm MQSeriesJava*.rpm MQSeriesJRE*.rpm MQSeriesGSKit*.rpm MQSeriesSamples*.rpm MQSeriesClient*.rpm"

# docker build --tag mq ./server/
# docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM1 --volume /var/example:/var/mqm --publish 1414:1414 --detach mq
# docker ps
# docker exec -it コンテナのID /bin/bash

2.キュー作成

https://github.com/ibm-messaging/mq-docker の手順そのままで起動したのでMQ1というキューマネージャがあるが、それはそれとして別に作る。
以下はコンテナ内でのコマンドである。念のため。

2.1 キュー・マネージャー作成

以下からコピペ。
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/bi00237_.htm

# crtmqm QM_ORANGE
# strmqm QM_ORANGE
2.2 キュー作成

以下からコピペ。
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/bi00238_.htm

# runmqsc QM_ORANGE
	5724-H72 (C) Copyright IBM Corp. 1994, 2016.
	Starting MQSC for queue manager QM_ORANGE.
	define qlocal (QM_APPLE) usage (xmitq)
	     1 : define qlocal (QM_APPLE) usage (xmitq)
		AMQ8006: IBM MQ queue created.
	define qremote (Q1) rname (Q1) rqmname(QM_APPLE) xmitq (QM_APPLE)
	     2 : define qremote (Q1) rname (Q1) rqmname(QM_APPLE) xmitq (QM_APPLE)
		AMQ8006: IBM MQ queue created.
2.3 メッセージ・チャネル作成、リスナー起動

以下からコピペ。2.2からの続きで "runmqsc QM_ORANGE" 実行中なので注意。
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/bi00239_.htm

	define channel (QM_ORANGE.QM_APPLE) chltype (RCVR) trptype (TCP)
	     3 : define channel (QM_ORANGE.QM_APPLE) chltype (RCVR) trptype (TCP)
		AMQ8014: IBM MQ channel created.
	alter listener(system.default.listener.tcp) trptype(tcp) port(1414)
	     4 : alter listener(system.default.listener.tcp) trptype(tcp) port(1414)
		AMQ8623: IBM MQ listener changed.
	start listener(system.default.listener.tcp)
	     5 : start listener(system.default.listener.tcp)
		AMQ8021: Request to start IBM MQ listener accepted.
	end
     	6 : end

3.サンプルプログラムで動作確認

MQに付帯しているサンプルプログラムを実行することで、キューマネージャ、リスナーが起動しているか確認。

3.1 PUT

とりあえず"UNKO"ってメッセージ入れてみた。リターンキーを二回打つとリクエストを終了させる。

# /opt/mqm/samp/bin/amqsput QM_APPLE QM_ORANGE
	Sample AMQSPUT0 start
	target queue is QM_APPLE
	UNKO
	Sample AMQSPUT0 end
3.2 キューの中身確認

入ってますな。

# /opt/mqm/samp/bin/amqsbcg QM_APPLE QM_ORANGE

	AMQSBCG0 - starts here
	**********************

	 MQOPEN - 'QM_APPLE'


	 MQGET of message number 1, CompCode:0 Reason:0
	****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'414D5120514D5F4F52414E47452020205AF1C458BEB37F25'
	  CorrelId : X'000000000000000000000000000000000000000000000000'
	  BackoutCount : 0
	  ReplyToQ       : '                                                '
	  ReplyToQMgr    : 'QM_ORANGE                                       '
	  ** Identity Context
	  UserIdentifier : 'root        '
	  AccountingToken :
	   X'0130000000000000000000000000000000000000000000000000000000000006'
	  ApplIdentityData : '                                '
	  ** Origin Context
	  PutApplType    : '6'
	  PutApplName    : 'amqsput                     '
	  PutDate  : '20170312'    PutTime  : '07110730'
	  ApplOriginData : '    '

	  GroupId : X'000000000000000000000000000000000000000000000000'
	  MsgSeqNumber   : '1'
	  Offset         : '0'
	  MsgFlags       : '0'
	  OriginalLength : '-1'

	****   Message      ****

	 length - 4 of 4 bytes

	00000000:  554E 4B4F                               'UNKO            '



	 No more messages
	 MQCLOSE
	 MQDISC
3.3 GET

取れてますな。15秒ほど待つとタイムアウトで接続が切れる。

# /opt/mqm/samp/bin/amqsget QM_APPLE QM_ORANGE
	Sample AMQSGET0 start
	message <UNKO>
	no more messages
3.4 もう一度キューの中身確認

GETで取得したので、残ってませんな。

# /opt/mqm/samp/bin/amqsbcg QM_APPLE QM_ORANGE
	AMQSBCG0 - starts here
	**********************
	
	 MQOPEN - 'QM_APPLE'
	
	
	
	No more messages
	MQCLOSE
	MQDISC

4.異常時

4.1 キュー・マネージャーを落としてみる
# endmqm QM_ORANGE
	Quiesce request accepted. The queue manager will stop when all outstanding work is complete.
# dspmq
	QMNAME(QM1)                                               STATUS(Running)
	QMNAME(QM_ORANGE)                                         STATUS(Ended normally)
4.2確認してみる。

接続エラー出た。

# /opt/mqm/samp/bin/amqsbcg QM_APPLE QM_ORANGE
	AMQSBCG0 - starts here
	**********************
	MQCONNX failed with CompCode:2, Reason:2059
4.3 エラーコード確認

上で出たエラーコード 2059を確認。キュー・マネージャーが落ちていることが確認できる。

# /opt/mqm/bin/mqrc 2059
	2059  0x0000080b  MQRC_Q_MGR_NOT_AVAILABLE

アプリ側に頼らなくとも、MQの付属品で十分確認出来ますな。
以上。