はじめに
普段はQiitaを使用させていただいてばかりで、記事を書くことはなかったのですが、
転職を機に金融業界のジャンルから離れることとなりました。
当分触れなくなるであろう金融業界おなじみのMWの知識を忘れないため、
個人の備忘としても残しておこうかと思い記事にいたしました。
本記事のMQ以外のMWの知識も随時更新していきたいと思います。
ダウンロード
IBM MQは以下のサイトからダウンロード可能です。
https://www.ibm.biz/ibmmqtrial
本記事記載時は、最新版の9.3および9.2がダウンロード可能でした。
いずれも試用版は90日間という制約がついています。
今回は「IBM MQ 9.3 Trial for Linux x86-64」をダウンロードしました。
インストール
OS情報
今回はVMWare上に構築した、CentOS8を使用しています。
cat /etc/os-release
NAME="CentOS Stream"
VERSION="8"
ID="centos"
~省略~
mqmユーザ/グループ作成
手動で作成しなくてもインストール時に自動で作成してくれるのですが、
実務だとOSのユーザやグループも基本的に管理されており、
作成するまでがセットになってるので、手順を記載しておきます。
# グループ作成(gidはお好みで)
groupadd -g 2000 mqm
# ユーザ作成(同じくuidはお好みで)
useradd -m -u 2000 -g mqm mqm
ユーザを作成したら、mqmの「.bash_profile」に以下の情報を追記しておきましょう。
export PATH=/opt/mqm/bin:/opt/mqm/samp/bin:/opt/mqm/gskit8/bin:$PATH
export LD_LIBRARY_PATH=/opt/mqm/gskit8/lib64:/opt/mqm/lib64:$LD_LIBRARY_PATH
ファイル確認&解凍
先ほどダウンロードしたファイルをサーバへアップロードし、解凍を行います。
ファイルが大量に表示されますが、使用するのは末尾にでてくるrpm形式のファイルのみです。
ls -l "9.3.0.0-IBM-MQTRIAL-LinuxX64.tar.gz"
-rw-r--r-- 1 root root 784177682 3月 24 23:34 9.3.0.0-IBM-MQTRIAL-LinuxX64.tar.gz
tar -xvzf "9.3.0.0-IBM-MQTRIAL-LinuxX64.tar.gz"
MQServer/
~省略~
MQServer/MQSeriesJRE-9.3.0-0.x86_64.rpm
ライセンス認証
解凍したファイルの中にMQServerというディレクトリがありますので、
移動後ライセンス認証を行います。
「-accept」オプションを付けるとライセンスを表示せず許可できます。
cd MQServer
./mqlicense.sh -accept
インストール
やっと実際のインストールです。
といってもrpmコマンドで必要なパッケージを指定して、
インストールを行うだけですが…。
その他で個人的にこれは入れたほうが良いなと思うものは、以下の3つです。
・Samples
→後述しますが、sampleコマンドを使用してMQに対しPUT/GETすることができます。
・Man
→マニュアル用のパッケージです。
・Msg_ja
→日本語化用パッケージです。
# MQのServer関連の基本パッケージ
rpm -ivh \
MQSeriesServer-9.3.0-0.x86_64.rpm \
MQSeriesGSKit-9.3.0-0.x86_64.rpm \
MQSeriesRuntime-9.3.0-0.x86_64.rpm
# おすすめパッケージ
rpm -ivh \
MQSeriesSamples-9.3.0-0.x86_64.rpm \
MQSeriesMan-9.3.0-0.x86_64.rpm \
MQSeriesMsg_ja-9.3.0-0.x86_64.rpm
無事ここまでインストールできれば、以下のようにパッケージが表示されると思います。
rpm -aq | sort | grep MQ
MQSeriesGSKit-9.3.0-0.x86_64
MQSeriesJRE-9.3.0-0.x86_64
MQSeriesJava-9.3.0-0.x86_64
MQSeriesMan-9.3.0-0.x86_64
MQSeriesMsg_ja-9.3.0-0.x86_64
MQSeriesRuntime-9.3.0-0.x86_64
MQSeriesSamples-9.3.0-0.x86_64
MQSeriesServer-9.3.0-0.x86_64
MQSeriesWeb-9.3.0-0.x86_64
インストールが終わったら実際にmqmユーザに切り替えて
確認をしてみましょう。
# バージョン確認コマンド
dspmqver
Name: IBM MQ
Version: 9.3.0.0
Level: p930-L220607.TRIAL
BuildType: IKAP - (Production)
Platform: IBM MQ for Linux (x86-64 platform)
Mode: 64-bit
O/S: Linux 4.18.0-536.el8.x86_64
O/S Details: CentOS Stream 8
InstName: Installation1
InstDesc:
Primary: No
InstPath: /opt/mqm
DataPath: /var/mqm
MaxCmdLevel: 930
LicenseType: Trial
各種オブジェクト作成
キューマネージャ作成
# 今回はTEST01.QMという名前で作成
crtmqm TEST01.QM
この IBM MQ のコピーの残りの試行期間は 90 日です。
IBM MQ キュー・マネージャー 'TEST01.QM' が作成されました。
ディレクトリー '/var/mqm/qmgrs/TEST01!QM' が作成されました。
キュー・マネージャーはインストール済み環境 'Installation1' に関連付けられています。
キュー・マネージャー 'TEST01.QM' のデフォルト・オブジェクトを作成または置換しています。
デフォルト・オブジェクトの統計 : 作成 83、置換 0、失敗 0
設定を完了中です。
設定が完了しました。
キューマネージャ起動
strmqm TEST01.QM
この IBM MQ のコピーの残りの試行期間は 90 日です。
システム・リソース RLIMIT_NOFILE が、IBM MQ には異常に低いレベルに設定されています。
IBM MQ キュー・マネージャー 'TEST01.QM' を開始しています。
キュー・マネージャーはインストール済み環境 'Installation1' に関連付けられています。
ログのやり直しフェーズ中に、キュー・マネージャー 'TEST01.QM' で 6 ログ・レコード がアクセスされました。
キュー・マネージャー 'TEST01.QM' のログのやり直しが完了しました。
キュー・マネージャー 'TEST01.QM' のトランザクション・マネージャーの状態が 回復されました。
プレーン・テキスト通信が有効になっています。
IBM MQ キュー・マネージャー 'TEST01.QM' が V9.3.0.0
を使用して開始されました。
リスナー起動
# そのまま実行すると帰ってこないため、&でバックグラウンド起動
nohup runmqlsr -m TEST01.QM -t TCP -p 1414 &
キューマネージャーの状態確認
dspmq
QMNAME(TEST01.QM) STATUS(実行中)
MQプロンプト起動
runmqsc TEST01.QM
5724-H72 (C) Copyright IBM Corp. 1994, 2022.
キュー・マネージャー TEST01.QM に対して MQSC を始動中です。
送信チャネル作成
# CONNAME:ホスト名(ポート)で記載
# XMITQ:チャネルに紐づける伝送キューを記載
DEFINE CHANNEL('01_TO_02.CH') CHLTYPE(SDR) CONNAME('VM-TEST02(1414)') XMITQ('TEST01_TO_TEST02_XMIT.Q') REPLACE
1 : DEFINE CHANNEL('01_TO_02.CH') CHLTYPE(SDR) CONNAME('VM-TEST02(1414)') XMITQ('TEST01_TO_TEST02_XMIT.Q') REPLACE
AMQ8014I: IBM MQ チャネルが作成されました。
受信チャネル作成
DEFINE CHANNEL('02_TO_01.CH') CHLTYPE(RCVR) REPLACE
2 : DEFINE CHANNEL('02_TO_01.CH') CHLTYPE(RCVR) REPLACE
AMQ8014I: IBM MQ チャネルが作成されました。
ローカルキュー作成
DEFINE QLOCAL('TEST01_LOCAL.Q') REPLACE
3 : DEFINE QLOCAL('TEST01_LOCAL.Q') REPLACE
AMQ8006I: IBM MQ キューが作成されました。
伝送キュー作成
DEFINE QLOCAL('TEST01_TO_TEST02_XMIT.Q') USAGE(XMITQ) REPLACE
4 : DEFINE QLOCAL('TEST01_TO_TEST02_XMIT.Q') USAGE(XMITQ) REPLACE
AMQ8006I: IBM MQ キューが作成されました。
リモートキュー作成
# RQMNAME:接続先システムのキューマネージャ名を記載
# RNAME:接続先システムのローカルキューを記載
# XMITQ:チャネル作成時に記載した伝送キューを指定
DEFINE QREMOTE('TEST01_TO_TEST02_REMOTE.Q') RQMNAME('TEST02.QM') RNAME('TEST02_LOCAL.Q') XMITQ('TEST01_TO_TEST02_XMIT.Q') REPLACE
5 : DEFINE QREMOTE('TEST01_TO_TEST02_REMOTE.Q') RQMNAME('TEST02.QM') RNAME('TEST02_LOCAL.Q') XMITQ('TEST01_TO_TEST02_XMIT.Q') REPLACE
AMQ8006I: IBM MQ キューが作成されました。
チャネル接続
今回はVMで作成したOSをコピーして、「VM-TEST02」というホスト名で接続先を作りました。
キューマネージャ名は「TEST02.QM」としています。
チャネルシーケンスリセット
RESET CHANNEL('01_TO_02.CH')
2 : RESET CHANNEL('01_TO_02.CH')
AMQ8023I: IBM MQ チャネルのリセット。
チャネル接続
START CHANNEL('01_TO_02.CH')
6 : START CHANNEL('01_TO_02.CH')
AMQ8018I: IBM MQ チャネルの開始が受け入れられました。
チャネル状態確認(SNDチャネル側)
こちらはSNDチャネル側から見たステータスです。
# STATUSが「RUNNING」となっていれば接続成功
DISPLAY CHSTATUS('01_TO_02.CH')
7 : DISPLAY CHSTATUS('01_TO_02.CH')
AMQ8417I: チャネル状況の内容を表示します。
CHANNEL(01_TO_02.CH) CHLTYPE(SDR)
CONNAME(192.168.179.131(1414)) CURRENT
RQMNAME(TEST02.QM) STATUS(RUNNING)
SUBSTATE(MQGET) XMITQ(TEST01_TO_TEST02_XMIT.Q)
チャネル状態確認(RCVチャネル側)
一方こちらはRCV側から見たステータスです。
# STATUSが「RUNNING」となっていれば接続成功
DISPLAY CHSTATUS('01_TO_02.CH')
1 : DISPLAY CHSTATUS('01_TO_02.CH')
AMQ8417I: チャネル状況の内容を表示します。
CHANNEL(01_TO_02.CH) CHLTYPE(RCVR)
CONNAME(192.168.179.130) CURRENT
RQMNAME(TEST01.QM) STATUS(RUNNING)
SUBSTATE(RECEIVE)
チャネル切断
STOP CHANNEL('01_TO_02.CH')
8 : STOP CHANNEL('01_TO_02.CH')
AMQ8019I: IBM MQ チャネルの停止が受け入れられました。
この状態でチャネルのステータスを確認すると、「STOPPED」となっています。
DISPLAY CHSTATUS('01_TO_02.CH')
9 : DISPLAY CHSTATUS('01_TO_02.CH')
AMQ8417I: チャネル状況の内容を表示します。
CHANNEL(01_TO_02.CH) CHLTYPE(SDR)
CONNAME(192.168.179.131(1414)) CURRENT
RQMNAME(TEST02.QM) STATUS(STOPPED)
SUBSTATE( ) XMITQ(TEST01_TO_TEST02_XMIT.Q)
キュー操作
プット
使用方法は「amqsput [キュー] [キューマネージャ]」となります。
今回は「TEST」という文字列を入力しました。
空行でEnterをすると終了とみなされます。
which amqsput
/opt/mqm/samp/bin/amqsput
amqsput TEST01_LOCAL.Q TEST01.QM
Sample AMQSPUT0 start
target queue is TEST01_LOCAL.Q
TEST
Sample AMQSPUT0 end
この状態でrunmqscコマンドでキューの滞留件数(CURDEPTH)を確認すると、
件数が1となっていることがわかります。
DISPLAY QLOCAL('TEST01_LOCAL.Q') CURDEPTH
1 : DISPLAY QLOCAL('TEST01_LOCAL.Q') CURDEPTH
AMQ8409I: キューの内容を表示します。
QUEUE(TEST01_LOCAL.Q) TYPE(QLOCAL)
CURDEPTH(1)
ゲット
プットと同じく「amqsget [ローカルキュー] [キューマネージャ]」となります。
先ほど投入した「TEST」という文字列が表示されるかと思います。
amqsget TEST01_LOCAL.Q TEST01.QM
Sample AMQSGET0 start
message <TEST>
no more messages
Sample AMQSGET0 end
キューの中身をゲットしてますので、滞留件数を確認すると0件になっています。
DISPLAY QLOCAL('TEST01_LOCAL.Q') CURDEPTH
1 : DISPLAY QLOCAL('TEST01_LOCAL.Q') CURDEPTH
AMQ8409I: キューの内容を表示します。
QUEUE(TEST01_LOCAL.Q) TYPE(QLOCAL)
CURDEPTH(0)
チャネル接続先へのデータの送受信
メッセージ送信
先ほど記載した、チャネル接続とamqsputを使用し接続先システム(今回は「VM-TEST02」)へ、
実際にデータを送信します。
メッセージは「TEST01 to TEST02 Message!」と送ってみます。
メッセージを送る際に気を付けるポイントとしては、
先ほど作成したリモートキューを指定してメッセージを書き込んでください。
amqsput TEST01_TO_TEST02_REMOTE.Q TEST01.QM
Sample AMQSPUT0 start
target queue is TEST01_TO_TEST02_REMOTE.Q
TEST01 to TEST02 Message!
Sample AMQSPUT0 end
メッセージ確認
受け手側で、リモートキューに紐づけたローカルキューを確認してみます。
1件メッセージが入ってるのがわかります。
DISPLAY QLOCAL('TEST02_LOCAL.Q') CURDEPTH
2 : DISPLAY QLOCAL('TEST02_LOCAL.Q') CURDEPTH
AMQ8409I: キューの内容を表示します。
QUEUE(TEST02_LOCAL.Q) TYPE(QLOCAL)
CURDEPTH(1)
amqsgetコマンドで実際にメッセージを確認すると、
先ほど送ったメッセージが届いているのがわかります。
amqsget TEST02_LOCAL.Q TEST02.QM
Sample AMQSGET0 start
message <TEST01 to TEST02 Message!>
no more messages
Sample AMQSGET0 end
MQ構成情報取得
MQの中のオブジェクトを1コマンドでバックアップすることができます。
必要ない情報も大量に出てくるため、grepで 「"DEFINE" | grep -v "('SYSTEM"」などを入れると
自身で作成したオブジェクトなどが表示できて便利です。
dmpmqcfg -x all -a -z -t all -o 1line -m TEST01.QM
*******************************************************************************
* Script generated on 2024-03-25 at 21.53.01
* Script generated by user 'mqm' on host 'VM-CETNOS01'
* Queue manager name: TEST01.QM
* Queue manager platform: UNIX
* Queue manager command level: (930/930)
* Command issued: dmpmqcfg -x all -a -z -t all -o 1line -m TEST01.QM
*******************************************************************************
ALTER QMGR ACCTCONO(DISABLED) ACCTINT(1800) ACCTMQI(OFF) ACCTQ(OFF) ACTIVREC(MSG) ACTVCONO(DISABLED) ACTVTRC(OFF) AUTHOREV(DISABLED) CCSID(1208) CERTLABL('ibmwebspheremqtest01.qm') CERTVPOL(ANY) CHAD(DISABLED) CHADEV(DISABLED) CHADEXIT(' ') CHLEV(DISABLED) CHLAUTH(ENABLED) CLWLDATA(' ') CLWLEXIT(' ') CLWLLEN(100) CLWLMRUC(999999999) CLWLUSEQ(LOCAL) CMDEV(DISABLED) CONFIGEV(DISABLED) CONNAUTH('SYSTEM.DEFAULT.AUTHINFO.IDPWOS') CUSTOM(' ') DEADQ(' ') DEFCLXQ(SCTQ) DEFXMITQ(' ') DESCR(' ') IMGINTVL(60) IMGLOGLN(OFF) IMGRCOVO(YES) IMGRCOVQ(YES) IMGSCHED(MANUAL) INHIBTEV(DISABLED) INITKEY(' ') IPADDRV(IPV4) LOCALEV(DISABLED) LOGGEREV(DISABLED) MARKINT(5000) MAXHANDS(256) MAXMSGL(4194304) MAXPROPL(NOLIMIT) MAXUMSGS(10000) MONACLS(QMGR) MONCHL(OFF) MONQ(OFF) PARENT(' ') PERFMEV(DISABLED) PSMODE(ENABLED) PSCLUS(ENABLED) PSNPMSG(DISCARD) PSNPRES(NORMAL) PSRTYCNT(5) PSSYNCPT(IFPER) REMOTEEV(DISABLED) REPOS(' ') REPOSNL(' ') REVDNS(ENABLED) ROUTEREC(MSG) SCHINIT(QMGR) SCMDSERV(QMGR) SSLCRLNL(' ') SSLCRYP(' ') SSLEV(DISABLED) SSLFIPS(NO) KEYRPWD(' ') SSLKEYR('/var/mqm/qmgrs/TEST01!QM/ssl/key') SSLRKEYC(0) STATACLS(QMGR) STATCHL(OFF) STATINT(1800) STATMQI(OFF) STATQ(OFF) STRSTPEV(ENABLED) SUITEB(NONE) TREELIFE(1800) TRIGINT(999999999) FORCE
~省略~
オブジェクト権限
Javaのプログラムなど、mqmユーザやグループに所属していないユーザがMQのオブジェクトにアクセスしようとすると、エラーが発生します。
その際は、オブジェクト権限付与のコマンドなどで必要な権限を与えてあげるとアクセス可能になります。
-m:キューマネージャ名
-t:オブジェクトタイプ
-p:権限付与ユーザ
末尾の「+connect」などはそのユーザに対しどのようなオブジェクト権限を付与するか記載します。
詳細は以下のIBMのページなどを見ていただければと思います。
https://www.ibm.com/docs/ja/ibm-mq/9.3?topic=reference-setmqaut-grant-revoke-authority
setmqaut -m TEST01.QM -t qmgr -p testuser +connect
setmqaut コマンドが正常に完了しました。
付与された権限は以下のコマンドで確認することが可能です。
dspmqaut -m TEST01.QM -t qmgr -p testuser
エンティティー testuser はオブジェクト TEST01.QM について次の許可を持っています:
connect
最後に
こういった技術系の書き物をするのは初めてで、レイアウトなどいけてなくて申し訳ありません。
慣れてきたら内容含めまたブラッシュアップしていきたいなと思います。
参考サイト
・IBM MQ ダウンロード
https://www.ibm.com/docs/ja/ibm-mq/9.3?topic=roadmap-mq-downloads
・mqlicense (インストール後のライセンスの受け入れ)
https://www.ibm.com/docs/ja/ibm-mq/9.3?topic=reference-mqlicense-accept-license-post-installation
・setmqaut (権限の付与または取り消し)
https://www.ibm.com/docs/ja/ibm-mq/9.3?topic=reference-setmqaut-grant-revoke-authority