MQを利用してファイル転送を試してみた

# はじめに

MQ30周年おめでとうございます:tada:
一つのソフトウェアが30年も続いているのはすごいですね。
私もこの30周年に合わせて何かできないかなと思いMQについて調べていたところMQにファイル転送機能があることを知りました。
(メッセージ交換がメインの機能のためファイルが転送できることにびっくりしました…)

今回は実際にMQのファイル転送機能であるMQFT(IBM MQ Managed File Transfer)を試してみたのでこちらを備忘録として記事にしたいと思います。

# MQFTとは

MQFTとはファイルをメッセージ形式に変換し、データの整合性を取りながら転送する技術です。






# やってみた

今回MQFTを試してみたのは下図のような構成です。
サーバ#1とサーバ#2にMQとMQFTをインストールし、MQ間のファイル転送を試してみました。

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/f0d1634c-021f-bdbd-8fa8-37f98e6a2b02.png)


MQFTではキューマネージャやキュー、チャネルの構成が下図のような形となります。
今回登場するキューマネージャには2つの種類があります。
一つ目のコマンド・キューマネージャはファイル転送を行い、2つ目の調整・キューマネージャがコマンド・キューマネージャ間の転送を管理する役割を担当します。

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/c54d98ab-5ab4-17e5-4551-d31b0d4efa7c.png)


## 1.MQFTのインストール

MQFT環境を構成するため、サーバ#1,2へ次のパッケージ※をインストールします。
※パッケージはIBM社のダウンロードサイトからダウンロードします。
```
＃RPMパッケージのインストール
rpm -ivh MQSeriesRuntime-9.2.0-0.x86_64.rpm MQSeriesServer-9.2.0-0.x86_64.rpm MQSeriesGSKit-9.2.0-0.x86_64.rpm MQSeriesFTAgent-9.2.0-0.x86_64.rpm　MQSeriesFTBase-9.2.0-0.x86_64.rpm　MQSeriesFTLogger-9.2.0-0.x86_64.rpm　MQSeriesFTService-9.2.0-0.x86_64.rpm　MQSeriesFTTools-9.2.0-0.x86_64.rpm
```




## 2.調整・キューマネージャの作成(サーバ#1)

サーバ#1にて調整・キューマネージャを作成します。
作成手順は以下の通りです。

:::note warn
注意1：チャネル設定
　ここでの注意点はチャネル設定が別途必要なことです。
　後述するコマンド・キューマネージャでも同様ですが、転送キューやチャネルの設定はマニュアルに記載がないため、忘れずに設定する必要があります。　
:::
```
#調整・キューマネージャの作成
$ fteSetupCoordination -coordinationQMgr MFT5 ＃構成スクリプト作成
$ crtmqm MFT5　＃キューマネージャ作成
$ strmqm MFT5　＃キューマネージャ起動
$ echo “ALTER QMGR CONNAUTH(‘’) CHLAUTH(DISABLED)” | runmqsc MFT5 ＃キューマネージャの設定
$ echo “DEFINE LISTENER(MFT5.LISTENER.TCP) TRPTYPE(TCP) CONTROL(QMGR) PORT(1771)” | runmqsc MFT5　＃リスナー設定
$ runmqsc MFT5 < MFT5.mqsc > mft5.txt ＃構成スクリプトの流し込み
$ endmqm MFT5　＃キューマネージャ停止
$ strmqm MFT5　＃キューマネージャ起動

＃注意１：チャネル設定　
$ echo “DEFINE CHANNEL(TO.MFT5) CHLTYPE(RCVR)” | runmqsc MFT5 ＃MFT4からMFT5への通信情報転送用チャネル
$ echo “DEFINE CHANNEL(FROM.CSM1) CHLTYPE(RCVR)" | runmqsc MFT5 ＃CSM1からMFT5への通信情報転送用チャネル
```






## 3.コマンド・キューマネージャの作成(サーバ#1)

サーバ#1にてコマンド・キューマネージャを作成します。
作成手順は以下の通りです。
```
＃コマンド・キューマネージャの作成
$ crtmqm MFT4　＃キューマネージャ作成
$ strmqm MFT4　＃キューマネージャ起動
$ echo “DEFINE LISTENER(MFT4.LISTENER.TCP) TRPTYPE(TCP) CONTROL(QMGR) PORT(1773)” | runmqsc MFT4　＃リスナー設定
$ echo "ALTER QMGR CONNAUTH('') CHLAUTH(DISABLED)" | runmqsc MFT4　＃キューマネージャの設定
```

次に調整・キューマネージャとの接続設定を作成します。
作成手順は以下の通りです。

:::note warn
注意2：転送キュー及びチャネルの設定
　調整・キューマネージャ同様にチャネルの設定と転送キューの設定が別途必要でした。
　また、チャネルが設定されていないとFTAgent(転送用のエージェント)が起動しないため、起動前にチャネルを作成する必要があります。
　(筆者はチャネル設定をせずにAgentを起動しようとしたためエラーが発生しました…)
:::

```
＃調整・キューマネージャとの接続設定を作成
$ fteSetupCommands -connectionQmgr MFT4 ＃調整・キューマネージャーとの接続設定作成(設定ファイルが生成される)
$ fteCreateAgent -agentName MFT4AGT1 -agentQMgr MFT4 ＃FTAgent構成スクリプト作成
$ runmqsc MFT4 < MFT4AGT1_create.mqsc > mft4.txt ＃FTAgent構成スクリプトの流し込み
$ endmqm MFT4　＃キューマネージャ停止
$ strmqm MFT4　＃キューマネージャ起動

＃注意2:転送キュー及びチャネルの設定
$ echo “DEFINE QLOCAL(MFT5) USAGE(XMITQ)” | runmqsc MFT4 ＃MFT4からMFT5への転送用キュー
$ echo “DEFINE QLOCAL(CSM1) USAGE(XMITQ)” | runmqsc MFT4 ＃MFT4からCSM1への転送用キュー
$ echo “DEFINE CHANNEL(TO.MFT5) CHLTYPE(SDR) CONNAME(‘127.0.0.1(1771)’) XMITQ(MFT5)” | runmqsc MFT4 ＃MFT4からMFT5への通信情報転送用チャネル
$ echo “DEFINE CHANNEL(TO.CSM1) CHLTYPE(SDR) CONNAME(‘mqft-1(1775)’) XMITQ(MFT5)” | runmqsc MFT4 ＃MFT4からCSM1へのファイル転送用チャネル

＃FTAgentの起動
$ fteStartAgent MFT4AGT1  ＃FTAgentの起動
$ fteListAgents ＃FTAgentの起動確認(稼働中Agentの一覧表示)
```



## 4.ロガーの設定(サーバ#1)
調整・キューマネージャには通信状況の履歴を保有するためのファイル(ロガー)が必要になります。
ここではサーバ#1にてロガーを作成します。
作成手順は以下の通りです。
```
$ fteCreateLogger -loggerQMgr MFT5 -loggerType FILE -fileLoggerMode CIRCULAR -fileSize 5MB -fileCount 3 MFT5lgr1 ＃ロガー構成スクリプト作成
$ runmqsc MFT5 < MFT5LGR1_create.mqsc > mft5lgr1.txt ＃スクリプトの流し込み
$ fteStartLogger MFT5LGR1　＃ロガーの起動
```
これでサーバ#1の方は設定完了です。
次にサーバ#2の設定を実施していきます。


## 5.コマンド・キューマネージャの作成(サーバ#2)

サーバ#2については調整・キューマネージャの作成が必要ないため、コマンド・キューマネージャのみ作成します。
作成手順は以下の通りです。
```
＃コマンド・キューマネージャの作成
$ crtmqm CSM1 ＃キューマネージャ作成
$ strmqm CSM1 ＃キューマネージャ起動
$ echo “DEFINE LISTENER(CSM1.LISTENER.TCP) TRPTYPE(TCP) CONTROL(QMGR) PORT(1775)” | runmqsc CSM1　＃リスナー設定
$ echo "ALTER QMGR CONNAUTH('') CHLAUTH(DISABLED)" | runmqsc CSM1　＃キューマネージャの設定
```
次に調整・キューマネージャとの接続設定を作成します。
サーバ#1と同様に転送キューとチャネル設置設定も忘れずに実施します。
作成手順は以下の通りです。

:::note warn
注意3：追加の調整・キューマネージャとの接続設定
　サーバ#2には調整・キューマネージャが無くサーバ#1の調整・キューマネージャ(MFT5)と接続する必要があるため、サーバ#1にて実施した接続設定前に追加でコマンドを実行する必要があります。
　サーバ#1のコマンド・キューマネージャ作成時には無かった手順のため忘れずに設定する必要があります。
:::

```
＃調整・キューマネージャとの接続設定を作成

＃注意3：追加の調整・キューマネージャとの接続設定
$ fteSetupCoordination -coordinationQMgr MFT5
   -coordinationQMgrHost mqft-0 -coordinationQMgrPort 1771
   -coordinationQMgrChannel MQMFT.MFT5.SVRCONN

＃調整キューマネージャとの接続設定
$ fteSetupCommands -connectionQMgr CSM1 ＃調整・キューマネージャとの接続設定作成　(設定ファイルが生成される)
$ fteCreateAgent -agentName CSM1AGT1 -agentQMgr CSM1 #FTAgent構成
$ runmqsc CSM1 < CSM1AGT1_create.mqsc > csm1agt1.txt ＃FTAgent構成スクリプトの流し込み
$ endmqm CSM1　＃キューマネージャ停止
$ strmqm CSM1　＃キューマネージャ起動

＃転送キュー及びチャネルの設定
$ echo “DEFINE QLOCAL(MFT5) USAGE(XMITQ)” | runmqsc CSM1 ＃CSM1からMFT5への転送用キュー
$ echo “DEFINE QLOCAL(MFT4) USAGE(XMITQ)” | runmqsc CSM1 ＃CSM1からMFT4への転送用キュー
$ echo “DEFINE CHANNEL(FROM.CSM1) CHLTYPE(SDR) CONNAME(‘mqft-0(1771)’) XMITQ(MFT5)” | runmqsc MFT4 ＃CSM1からMFT5への通信情報転送用チャネル
$ echo “DEFINE CHANNEL(TO.MFT4) CHLTYPE(SDR) CONNAME(‘mqft-0(1773)’) XMITQ(MFT4)” | runmqsc MFT4 ＃CSM1からMFT4へのファイル転送用チャネル

＃FTAgentの起動
$ fteStartAgent CSM1AGT1  ＃FTAgentの起動
$ fteListAgents ＃FTAgentの起動確認(稼働中Agentの一覧表示)
```



これでMQFTの設定は完了です。

## 6.MQ Explorerを利用したファイルの転送

実際にファイルを転送する際にはサーバ#1やサーバ#2の転送Agent(FTAgent)に対して働きかけるアプリケーションが必要ですが、今回はMQ Explorerを利用してファイルのプッシュを実施します。

MQ Explorerを起動すると、”ファイル転送管理”という項目があるため右クリックし、”新規作成”をクリックします。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/2f151831-33d1-8180-11e5-12a6ebb8f30d.png)


新規作成を選択後、作成した調整・キューマネージャーを選択し、”次へ”をクリックします。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/0791fee1-4427-c4bc-cf6f-1bf8ea60d55d.png)


調整・キューマネージャを選択後、コマンド・キューマネージャを選択します。
今回、サーバ#2からサーバ#1に対してファイルを転送するため、サーバ#2に作成した”CSM1”を選択しました。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/40847043-749e-df4d-feb0-b8eeaf60da25.png)


最後に、作成しているファイル転送管理の構成に管理名を付ける必要があります。
デフォルトは調整・キューマネージャ名が使用されるようなので、デフォルト設定で設定しました。

![0４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/693d170c-7630-c848-4533-34c0a1e89154.png)


これでMQ Explorer側の設定も完了です。
ホーム画面にも先ほど設定した内容が表示されていました。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/924d4fb8-a4cd-eeb4-a5bd-1b75eb5500b2.png)


ここからは実際にファイルの転送をしていきます。
作成したファイル転送管理”MFT5”を右クリックし、”新規の転送…”をクリックします。

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/1138ad52-8115-7aa3-d661-972b4580c3fb.png)

エージェントの選択画面に移行するので、送信元(ソース・エージェント)と送信先(宛先エージェント)を選択します。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/1ed84fd9-006a-52de-feec-825a4dbd48f0.png)



エージェント選択後、転送条件の追加ができます。
ここで実際に転送するファイルを選択していきます。
ファイルを選択するために"追加"をクリックします。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/9823d62f-3281-a22b-6682-acc3de91e216.png)



転送項目の追加画面に移行するので、転送するファイルを下記赤枠より選択します。
選択後、OKをクリックします。

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/571f3201-885e-53e5-cf41-231061734635.png)



無事、転送設定が完了しました。
最後に”終了”をクリックすると転送が始まります。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/3c529118-ad35-43d3-985f-bf7c71f4a84f.png)


ホーム画面に戻ってみると、転送が開始されており、転送が成功したログが表示されていました。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/dff38e59-4544-3ca4-1d0c-e45501d98444.png)



実際にサーバ#1にログインし、対象のディレクトリを確認してみたところ、無事テストファイルが転送されていました！
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439811/f8ca8217-799a-9e20-cc92-54ed11b56c04.png)




# おわりに
縁の下の力持ちというイメージがあるMQのため、メッセージ転送の機能ばかりに目が行きますが、それ以外にも機能を取り揃えています。
これを機会に皆さんも再度MQ周りの機能について確認してみてはいかがでしょうか。
筆者も改めてMQの機能確認が必要だなと思わされました…