IBM TechXchange Integration Group Japan

IBM TechXchange Integration Group Japan

 View Only

MQ 虎の巻 : 5.アプリケーションプログラムの作成 

Thu June 10, 2021 08:23 AM

5.アプリケーションプログラムの作成

5.1 アプリケーションプログラムの作成について

アプリケーションを作成する手順に焦点を当てて説明をします。
まず最初に、各プラットフォームで使用可能なプログラム言語について説明します。
その後、サンプルアプリケーションを実際に作成していく手法を順を追って説明していきます。
今回はプラットフォームはLinux (RHEL 5)、プログラム言語はC(gccのバージョンは、4.1.2)を使って解説します。その他の環境については、下記のマニュアルを参考にして下さい。

- アプリケーション・プログラミング・ガイド
- アプリケーション・プログラミング・リファレンス
- .NETの使用
- C++の使用
- Javaの使用
- i5/OS® アプリケーション・プログラミング・リファレンス (ILE RPG)

5.2 MQアプリケーション作成に使用できる言語

WebSphere MQにて使用できるプログラミング言語は、以下のとおりです。

MQ言語

サポートされるコンパイラーについて
"WebSphere MQ - System requirements" ( http://www-01.ibm.com/software/integration/wmq/requirements/index.html ) のページで、WebSphere MQが各プラットフォーム上でサポートするコンパイラーを確認できます。
例えば、WebSphere MQV7がAIXでサポートするコンパイラーを確認するためには、下のように"WebSphere MQ V7"を選択し、AIXのフィールドにある"Detailed system requirements for xxxxxx"をクリックします。

Prereq

すると、WebSphere MQ V7がサポートするソフトウェアの一覧表が表示されます。この表の
- "For C/C++ applications"
- "For COBOL applications"
- "For Java applications using the WebSphere MQ classes for Java or JMS"
の欄を確認して下さい。(他のプラットフォームの場合、表示されるプログラム言語が異なる場合があります)

5.3 環境の説明・準備作業

これ以降の説明は、WebSphere MQ バージョン7.0と下記のソフトウェアを前提として進めていきます。

  OS ・・・ RedHat Enterprise Linux V5
コンパイラー ・・・ gcc バージョン 4.1.2

またアプリケーションがアクセスするキューマネージャーおよびキューは、以下の構成および名称になります。

アプリケーション構成
事前にキューマネージャーやキューを下記の手順で作成します。なお、作業はグループ"mqm"に属するユーザーで行ってください。
1. キューマネージャーの作成

ターミナルを開いて、次のコマンドを実行し、キューマネージャーを作成します。
[mqm@r50p ~]$ crtmqm PTP
WebSphere MQ キュー・マネージャーが作成されました。
PTP のデフォルト・オブジェクトを作成または置換しています。
デフォルト・オブジェクトの統計 : 作成 58、置換 0、失敗 0
設定を完了中です。
設定が完了しました。​


2. キューマネージャーの開始

次のコマンドをターミナルから実行し、キューマネージャーを開始します。
[mqm@r50p ~]$ strmqm PTP
WebSphere MQ キュー・マネージャー 'PTP' を開始しています。
ログのやり直しフェーズ中に、キュー・マネージャー 'PTP' で 5 ログ・レコード がア
クセスされました。
キュー・マネージャー 'PTP' のログのやり直しが完了しました。
キュー・マネージャー 'PTP' のトランザクション・マネージャーの状態が 回復されました。
キュー・マネージャー 'PTP' が始動しました。


3. キューの定義

テキスト・エディターを使って、下記の内容のファイルを作成し、"ptp.mqsc"という名前で保存します。
 define qlocal(PTP.LQ)
 define qlocal(PTP.REQ)
 define qlocal(PTP.REP)​

次のコマンドをターミナルから実行し、キューを作成します。

[mqm@r50p ~]$ runmqsc PTP < ./ptp.mqsc
5724-H72 (C) Copyright IBM Corp. 1944, 2008.  ALL RIGHT RESERVED.
キュー・マネージャー PTP に対して MQSC を始動中です。

   1 : define qlocal(PTP.LQ)
AMQ8006: WebSphere MQ キューが作成されました。
     2 : define qlocal(PTP.REQ)
AMQ8006: WebSphere MQ キューが作成されました。
     3 : define qlocal(PTP.REP)
AMQ8006: WebSphere MQ キューが作成されました。
3 MQSC コマンドが読み取られました。
構文エラーがあるコマンドはありません。
有効な MQSC コマンドはすべて処理されました。​


5.4 Sender & Consumer (一方向型)

この節では、一方向型のメッセージ転送を行うSenderとConsumerという二つのプログラムを作成し、実行する手順を紹介します。

下記のソースプログラムを適当なディレクトリーにコピーして下さい。以降の説明では、ホーム・ディレクトリーに"work"というディレクトリーを作成し、"~/work/"へこれらをコピーしたものとして、実行結果等を掲載しています。

  • 送信用プログラム  :   send.c
  • 受信用プログラム :   consumer.c


Senderプログラムの機能

指定したキューに"This is a simple Send/Forget sample"という内容のテキストデータをメッセージとして書き込んで終了するプログラムです。

プログラムの動作の流れは以下の通りになります。

1) (MQCONN) キューマネージャーPTPに接続

2) (MQOPEN) PTP.LQキューをメッセージを書き出すためのキューとしてオープン

3) メッセージをバッファーにセット

4) (MQPUT) オープンされたキューに対してメッセージを書き出す

5) (MQCLOSE) キューPTP.LQをクローズ

6) (MQDISC) キューマネージャーPTPから切断

()内は、利用するMQI

コンパイル手順


コンパイルの実行

Linuxのターミナルから、下記コマンドを入力し、コンパイル/リンクを行います。

gcc -m32 -o send send.c -I/opt/mqm/inc -L/opt/mqm/lib -Wl,-rpath=/opt/mqm/lib -Wl,-rpath=/usr/lib -lmqm_r


(注意)
1) "-Wl"オプションの"l"は、エルの小文字です.
2) "-Wl,"オプションと"-rpath"オプションとの間に、ブランクを入れないようにしてください。


コンパイルが正常終了すると、"send"という実行ファイルが生成されます。


実行方法


ターミナルから、キュー・マネージャー "PTP" を開始し、"send"を実行します。

実行すると、下記のようなメッセージが表示されます。

 [mqm@r50p ~/work]$ strmqm PTP
 WebSphere MQ キュー・マネージャー PTP' を開始しています。
 ログのやり直しフェーズ中に、キュー・マネージャー 'PTP' で 5 ログ・レコードがア
 クセスされました。
 キュー・マネージャー 'PTP' のログのやり直しが完了しました。
 キュー・マネージャー 'PTP' のトランザクション・マネージャーの状態が 回復されまし
 た。
 WebSphere MQ キュー・マネージャー 'PTP' が始動しました。
 [mqm@r50p ~/work]$ ./send
 Send/Forget Sample
 Target queue is PTP.LQ
 sample Send/Forget program end
 [mqm@r50p ~/work]$ 


以上により、キューマネージャー"PTP"のキュー"PTP.LQ"にメッセージが書き込まれました。


実行結果の確認

1) MQSCコマンドの開始

ターミナルより下記コマンドを実行し、MQSCコマンドの対話モードに入ります。

runmqsc PTP



2) キュー上のメッセージ数の確認

MQSCコマンドの対話モードにて、次のコマンドを入力すると、キューに保持されているメッセージ数を確認できます。この値が"send"実行前より1つ増えていることを確認します。

DISPLAY QLOCAL(PTP.LQ) CURDEPTH



下記のような実行結果が得られます。

 [mqm@r50p ~/work]$ runmqsc PTP
 5724-H72 (C) Copyright IBM Corp. 1994, 2008.  ALL RIGHTS RESERVED. 
 キュー・マネージャー 'PTP' に対して MQSC を始動中です。


 DISPLAY QLOCAL(PTP.LQ) CURDEPTH
      1 : DISPLAY QLOCAL(PTP.LQ) CURDEPTH
 AMQ8409: キューの内容を表示します。
    QUEUE(PTP.LQ)                             TYPE(QLOCAL)
    CURDEPTH(1)


"END"と入力し、MQSCの対話モードを終了してください。

3) メッセージの内容の確認

WebSphere MQのサンプル・プログラム "/opt/mqm/samp/bin/amqsgbr"を利用して、実際にキューの中に正しくメッセージが書き込まれたことを確認します。

 [mqm@r50p ~/work]$ /opt/mqm/samp/bin/amqsgbr PTP.LQ PTP
 Sample AMQSGBR0 (browse) start
 PTP
 Messages for PTP.LQ
 1 <This is a simple Send/Forget sample>
 no more messages
 Sample AMQSGBR0 (browse) end


Consumerプログラムの機能


キューから、メッセージを1つだけ取得するCプログラムです。

Senderプログラムはメッセージの送り手、Consumerプログラムはメッセージの受け手として動作します
ここで使用するComsumerプログラムは以下のように動作します

1) (MQCONN) キューマネージャーPTPに接続

2) (MQOPEN) PTP.LQキューをメッセージを取り出すためのキューとしてオープン

3) メッセージを読み込むためのデータバッファを確保

4) (MQGET) オープンしたキューからメッセージの取り出し

5) 取り出したメッセージを画面に表示

6) (MQCLOSE) キューPTP.LQをクローズ

7) (MQDISC) キューマネージャーPTPから切断

()内は、利用するMQI

コンパイルの実行

Linuxのターミナルから、下記コマンドを入力し、コンパイル/リンクを行います。

gcc -m32 -o consumer consumer.c -I/opt/mqm/inc -L/opt/mqm/lib -Wl,-rpath=/opt/mqm/lib -Wl,-rpath=/usr/lib -lmqm_r

(注意)
1) "-Wl"オプションの"l"は、エルの小文字です.
2) "-Wl,"オプションと"-rpath"オプションとの間に、ブランクを入れないようにしてください。

コンパイルが正常終了すると、"consumer"という実行ファイルが生成されます。


実行方法



1) ターミナルで先に作成した"send"を実行しておき、キュー "PTP.LQ" にメッセージが存在する状態にしておきます。

2) ターミナルより、"consumer"を実行します。

 [mqm@r50p ~/work]$ ./send
 Send/Forget Sample
 Target queue is PTP.LQ
 sample Send/Forget program end
 [mqm@r50p ~/work]$ ./consumer
 Consumer Sample
 message <This is a simple Send/Forget sample>
 sample Consumer program end

これにより、メッセージがキューから取り出された事になります。
キューにメッセージが存在しない状態でこの"consumer"プログラムを実行すると、15秒後に下記のようなメッセージが表示されます。

 [mqm@r50p ~/work]$ ./consumer
 Consumer sample
 no more messages
 sample Consumer program end

実行結果の確認

1) MQSCコマンドの開始

ターミナルより下記コマンドを実行し、MQSCコマンドの対話モードに入ります。

runmqsc PTP



2) キュー上のメッセージ数の確認

MQSCコマンドの対話モードにて、次のコマンドを入力すると、キューに保持されているメッセージ数が表示されます。この値が"consumer"実行前より1つ減少していることを確認します。

DISPLAY QLOCAL(PTP.LQ) CURDEPTH

下記のような実行結果が得られます。

 [mqm@r50p ~/work]$ runmqsc PTP
 5724-H72 (C) Copyright IBM Corp. 1994, 2008.  ALL RIGHTS RESERVED. 
 キュー・マネージャー 'PTP' に対して MQSC を始動中です。


 DISPLAY QLOCAL(PTP.LQ) CURDEPTH
      1 : DISPLAY QLOCAL(PTP.LQ) CURDEPTH
 AMQ8409: キューの内容を表示します。
    QUEUE(PTP.LQ)                             TYPE(QLOCAL)
    CURDEPTH(0)


"END"と入力し、MQSCの対話モードを終了してください。


Request & Reply (双方向型)

この節では、双方向型のメッセージ転送を行うRequestとReplyとうい二つのプログラムを作成し、実行する手順を紹介します。

下記のソースプログラムを適当なディレクトリーにコピーして下さい。

  • 要求用プログラム  :   request.c
  • 応答用プログラム :   reply.c

Requestプログラムの機能


このサンプル・プログラム"request"は、
- 指定したキューに"This is a simple Request/Reply sample"という内容のテキストデータをメッセージとして送信(メッセージを "PTP.REQ" キューに書き込む)
- 指定したリプライ・キュー "PTP.REP" にその応答メッセージが到着するのを待機
- 応答メッセージが到着したら受信し、それを画面に表示
してから終了するCプログラムです。Requestプログラムは、以下のように動作します。

1) (MQCONN) キューマネージャーPTPに接続

2) (MQOPEN) 出力用のリクエスト・キューPTP.REQをオープン

3) (MQOPEN) 入力用のリプライ・キューPTP.REPをオープン

4) メッセージをバッファーにセット

5) (MQPUT) リクエスト・キューにメッセージを書き込む

6) メッセージを受信するためのデータ・バッファーを初期化

7) メッセージの識別に使用するための相関IDを指定

8) (MQGET) リプライ・キューからメッセージを読み出す(最大15秒、メッセージの到着を待ちます)

9) 受信したメッセージを画面に表示

10) (MQCLOSE) リクエスト・キュー "PTP.REQ" をクローズ

11) (MQCLOSE) リプライ・キュー "PTP.REP" をクローズ

12) (MQDISC) キューマネージャーPTPから切断

コンパイルの実行

Linuxのターミナルから、下記コマンドを入力し、コンパイル/リンクを行います。

gcc -m32 -o request request.c -I/opt/mqm/inc -L/opt/mqm/lib -Wl,-rpath=/opt/mqm/lib -Wl,-rpath=/usr/lib -lmqm_r


(注意)
1) "-Wl"オプションの"l"は、エルの小文字です.
2) "-Wl,"オプションと"-rpath"オプションとの間に、ブランクを入れないようにしてください。


コンパイルが正常終了すると、"request"という実行ファイルが生成されます。


Replyプログラムの機能


サンプル・プログラム"request" は、
- Requestプログラムにより書き込まれたメッセージをリクエスト・キュー "PTP.REQ" から取得
- その内容を画面に表示
- 指定されたリプライ・キュー "PTP.REP" に書き戻す
Cプログラムです。ここで使用するReplyプログラムは、以下のように動作します

1) (MQCONN) キューマネージャーPTPに接続

2) (MQOPEN) 入力用のリクエスト・キューPTP.REQをオープン

3) メッセージを受信するためのデータ・バッファーを初期化

4) (MQGET) リクエスト・キューからメッセージを読み出す(メッセージが到着するまで永久に待ち続けます)

5) 受信したメッセージ・データを画面に表示

6) 送信用のメッセージを用意

7) メッセージの識別に使用するための相関IDを指定
- リプライ・キュー名は、リクエスト・メッセージから入手
- リクエスト・メッセージのメッセージIDを利用

9) (MQPUT1) メッセージをリプライ・キューに書き込む

10) (MQCLOSE) リクエスト・キューをクローズ

11) (MQDISC) キューマネージャーPTPから切断


コンパイルの実行

Linuxのターミナルから、下記コマンドを入力し、コンパイル/リンクを行います。

gcc -m32 -o reply reply.c -I/opt/mqm/inc -L/opt/mqm/lib -Wl,-rpath=/opt/mqm/lib -Wl,-rpath=/usr/lib -lmqm_r


(注意)
1) "-Wl"オプションの"l"は、エルの小文字です.
2) "-Wl,"オプションと"-rpath"オプションとの間に、ブランクを入れないようにしてください。


コンパイルが正常終了すると、"reply"という実行ファイルが生成されます。

実行方法

RequestプログラムとReplyプログラムは連携して稼動するようになっています。
まずは、ターミナルから"reply"を実行します。
次のようなメッセージが画面に表示されます。

 [mqm@r50p ~/work]$ ./reply
  Request/Reply Sample - Reply program
  The request queue is   PTP.REQ


これで、"reply"はリクエスト・キュー "PTP.REQ" にメッセージが到着するのを待っている状態になります。

続いて、別のターミナルから"request"を実行します。
次のようなメッセージが画面に表示されます。

  [mqm@r50p ~/work]$ ./request
  Request/Reply Sample - Request program
  The request queue is PTP.REQ
  The reply queue is   PTP.REP
  The reply message    <This is a reply message demonstrating simple Request
 /Reply>
  Request/Reply Sample end


これは、"request"と"reply"が正常に双方向型(要求・応答型)の処理を完了した事を示します。

一方、"reply"を実行したターミナルでは、以下のようにメッセージ受信内容部分が新たに表示されます。

 [mqm@r50p ~/work]./reply
  Request/Reply Sample - Reply program
  The request queue is PTP.REQ
   The request message <This is a request message demonstating simple Request/Reply>  
  The replay queue is PTP.REP
 Request/Reply Sample end


これは、キュー "PTP.REQ" にメッセージの到着を待っていた"reply"が正常にメッセージを受け取り、応答のメッセージをリプライ・キュー "PTP.REP" に書き込んだ事を示します。

5.6 Publish/Subscribe型アプリケーション

WebSphere MQにおける、Publish/Subscribe型アプリケーションのサポートについて説明します。

JMSでサポートされている1対Nのメッセージ配信を行う"Publish/Subscribe"という仕組みを、WebSphere MQではV5の頃から実装しています。

この節では、WebSphere MQ V7でのPublish/Subscribeの仕組みをお話しした後、WebSphere MQ V7に同梱されているサンプル・プログラムによる実際の動きを見てみたいと思います。


(1) WebSphere MQ V7におけるPublish/Subscribeの仕組み

WebSphere MQ V7のPub/Subの仕組み

- Publish/Subscribeブローカー

WebSphere MQ V7では、キュー・マネージャーの開始とともに起動するプロセス "amqfqpub" と、その子プロセス "amqfcxba" が、ブローカーとして機能しています。キュー・マネージャーのPSMODE属性 (ENABLED | DISABLED | COMPATIBLE)によって、これらのプロセスの起動または停止が制御されます。
        *1: "alter qmgr psmode(xxxxxxx)"で変更すると、プロセスが自動的に停止/再始動します。

他のキュー・マネージャーとのチャネル接続が存在する場合、そのチャネルを利用してブローカー間に「親子関係」を持つブローカー・ネットワークを構成したり、キュー・マネージャー・クラスターを利用したブローカー・ネットワークを構成することも可能です。

ネットワーク接続している他のブローカーを含めて、ブローカーの活動状況は"display pubsub type(all) all"コマンドで表示することができます。

[display pubsubコマンドの実行例]
キュー・マネージャー "orange"と"grape"のそれぞれで稼働しているPublish/Subscribeブローカーが親子関係になっていることがわかります。

[mqm@r50p ~/work]$ runmqsc orange
5724-H72 (C) Copyright IBM Corp. 1994, 2008.  ALL RIGHTS RESERVED.
キュー・マネージャー orange に対して MQSC を始動中です。

display pubsub type(all)  all
     1 : display pubsub type(all)  all
AMQ8723: パブリッシュ/サブスクライブ状況の詳細を表示します。
   QMNAME(orange)                          TYPE(LOCAL)
   STATUS(ACTIVE)
AMQ8723: パブリッシュ/サブスクライブ状況の詳細を表示します。
   QMNAME(grape)                           TYPE(PARENT)
   STATUS(ACTIVE)

- Topic

Topicは、情報の種類を意味するオブジェクトで、情報の作成/発信者(Publisher)と情報の利用者(Subscriber)を結びつけるためのオブジェクトになります。
WebSphere MQ V7からは、Topicをキューやチャネルと同様のキュー・マネージャーのオブジェクトとして、定義/管理/削除することができるようになりました。

他のMQオブジェクトのように、Topicオブジェクトにもいくつかの属性がありますが、特に重要な属性はTopicstr属性になります。

[MQSCのdisplay topicコマンドによる、Topicの各種属性の表示例]

display topic('Sample')
     1 : display topic('Sample')
AMQ8633: トピックの詳細を表示します。
   TOPIC(Sample)                           TYPE(LOCAL)
   TOPICSTR(/Rainbow)             DESCR( )
   CLUSTER( )                              DURSUB(ASPARENT)
   PUB(ASPARENT)                           SUB(ASPARENT)
   DEFPSIST(ASPARENT)                      DEFPRTY(ASPARENT)
   DEFPRESP(ASPARENT)                      ALTDATE(2009-05-18)
   ALTTIME(10.31.44)                       PMSGDLV(ASPARENT)
   NPMSGDLV(ASPARENT)                      PUBSCOPE(ASPARENT)
   SUBSCOPE(ASPARENT)                      PROXYSUB(FIRSTUSE)
   WILDCARD(PASSTHRU)                      MDURMDL( )
   MNDURMDL( )

- PublisherとSubscriber

Publisherは情報を作成しTopicへ発信するプログラムで、WebSphere MQ V7.0の場合、以下のような流れでAPIを呼び出します。

PublishにおけるMQIコールの流れここで、
- MQOPENとMQCLOSEの対象.
- メッセージをMQPUTする対象.
がTopicまたはTopicストリングである点を除くと、このAPIの流れはメッセージをキューにMQPUTするアプリケーションと同じロジックになります。


これに対して、SubscriberはTopicから情報を入手し利用するプログラムで、以下のようなAPIを利用します。
SubscriberにおけるMQIの流れ
この流れの中では、
- MQSUBという新しいAPIを利用して、TopicまたはTopicストリングへ接続 (MQOPENではない).
- MQCLOSEを二回実行。
という特徴があります。

(2) Pub/Subプログラム実行の準備 (以降の作業は、ユーザー "mqm"で実施します)

まず、キュー・マネージャー "PUBSUB" を作成し、起動します。

[mqm@r50p ~/work]$ crtmqm PUBSUB
WebSphere MQ キュー・マネージャーが作成されました。
PUBSUB のデフォルト・オブジェクトを作成または置換しています。
デフォルト・オブジェクトの統計 : 作成 58、置換 0、失敗 0
設定を完了中です。
設定が完了しました。
[mqm@r50p ~/work]$ strmqm PUBSUB
WebSphere MQ キュー・マネージャー PUBSUB' を開始しています。
ログのやり直しフェーズ中に、キュー・マネージャー 'PUBSUB' で 5 ログ・レコード がアクセスされました。
キュー・マネージャー 'PUBSUB' のログのやり直しが完了しました。
キュー・マネージャー 'PUBSUB' のトランザクション・マネージャーの状態が 回復され ました。
WebSphere MQ キュー・マネージャー 'PUBSUB' が始動しました。

次に、runmqscコマンドを使って、Topicstr属性 "/Rainbow" を持つ Topic "Sample" を作成します。

[mqm@r50p ~/work]$ runmqsc PUBSUB
5724-H72 (C) Copyright IBM Corp. 1994, 2008.  ALL RIGHTS RESERVED.
キュー・マネージャー PUBSUB に対して MQSC を始動中です。

define topic('Sample') +
     1 : define topic('Sample') +
topicstr('/Rainbow')
       : topicstr('/Rainbow')
AMQ8690: WebSphere MQ トピックが作成されました。


display pubsubコマンドを使って、ブローカーが ACTIVE になっていることを確認します。

display pubsub type(all)  all
     2 : display pubsub type(all)  all
AMQ8723: パブリッシュ/サブスクライブ状況の詳細を表示します。
   QMNAME(PUBSUB)                          TYPE(LOCAL)
   STATUS(ACTIVE)

(3) サンプル・プログラム

WebSphere MQ V7のサンプル・プログラムを使います。まず、MQSeriesSamples-7.0.0.xパッケージが導入されている事を確認して下さい。("rpm -qa |grep MQSeriesSamples"コマンドで確認できます)
もしMQSeriesSamples-7.0.0.xパッケージが導入されていない場合には、以下のソースをコンパイル/リンクしてお使い下さい。コンパイル/リンク手順は、以下の通りです。

(Publisher側)
gcc -m32 -o amqspub amqspuba.c -I/opt/mqm/inc -L/opt/mqm/lib \
-Wl,-rpath=/opt/mqm/lib -Wl,-rpath=/usr/lib -lmqm_r

(Subscriber側)
gcc -m32 -o amqssub amqssuba.c -I/opt/mqm/inc -L/opt/mqm/lib \
-Wl,-rpath=/opt/mqm/lib -Wl,-rpath=/usr/lib -lmqm_r

(注意)
1) "-Wl"オプションの"l"は、エルの小文字です.
2) "-Wl,"オプションと"-rpath"オプションとの間に、ブランクを入れないようにしてください。

Publisherプログラムの機能


amqspubは、
・第一パラメータに、オープンするTopic
・第二パラメータに、キュー・マネージャー名(省略した場合、デフォルト・キュー・マネージャーに接続)
を指定します。

1) (MQCONN) 指定されたキュー・マネージャーとの接続を行います。

2) (MQOPEN) 指定されたTOPICをオープンします。

3) (MQPUT) コマンド・ラインから入力された文字列(99文字以内)を、TOPICへPublishします。
・ブランク行(何も入力せず、改行キーを押す)まで、入力された文字列をPublishします。

4) (MQCLOSE) TOPICをクローズします。

5) (MQDISC) キュー・マネージャーからの切断を行います。


Subscriberプログラムの機能


amqssubは、
・第一パラメータに、オープンするTopic
・第二パラメータに、キュー・マネージャー名(省略した場合、デフォルト・キュー・マネージャーに接続)
を指定します。

1) (MQCONN) 指定されたキュー・マネージャーとの接続を行います。

2) (MQSUB) Brokerに対して、指定されたTopicに対するSubscriberとして登録を行います。このAPIにより、
- 内部的にキューがオープンされ、そのキューに対するオブジェクト・ハンドル (HObj)
- Subscribeするためのオブジェクト・ハンドル (HSub)
が、プログラムに戻ります。

3) (MQGET) 登録したTopicに対してPublishされたメッセージを、Brokerから受け取ります。

4) 受け取ったメッセージを、画面に表示します。

5) (MQCLOSE) Subscribeのためのオブジェクト・ハンドル(HSub)を解放することで、Subscriptionをクローズします。

6) (MQCLOSE) 内部的に利用していたキューをクローズします。(HObjの解放を実行)

7) (MQDISC) キュー・マネージャーからの切断を行います。


実行方法

(1) ターミナルを、3つ開きます。
- 一つのターミナルはPublisher側サンプル amqspub用に、残りのターミナルはSubscriber側サンプル・プログラム amqssub用に使います。

(2) ターミナルの一つで、Publisher側サンプル・プログラム amqspub を
- 第一パラメータに、先ほど作成したTopic "Sample"
- 第二パラメータに、キュー・マネージャー名 "PUBSUB"
を指定して実行します。入力待ち状態になりますので、そのままにしておきます。

[mqm@r50p ~]$ /opt/mqm/samp/bin/amqspub Sample PUBSUB
Sample AMQSPUBA start
target topic is Sample


(3) 残りのターミナルで、Subscriber側サンプル・プログラム amqssub を
- 第一パラメータに、先ほど作成したTopic "Sample"
- 第二パラメータに、キュー・マネージャー名 "PUBSUB"
を指定して、実行します。Publishされた情報の待ち状態になります。

[mqm@r50p ~/work]$ /opt/mqm/samp/bin/amqssub Sample PUBSUB
Sample AMQSSUBA start
Calling MQGET : 30 seconds wait time


(4) 入力待ち状態になっているPublisher側サンプル・プログラム amqspub に、適当なメッセージをいくつか入力します。すると、Subscriber側サンプル・プログラム amqssub を実行しているターミナル上に、ほぼ同時に同じメッセージが表示されます。

- Publisherサンプル・プログラム amqspub側

[mqm@r50p ~]$ /opt/mqm/samp/bin/amqspub Sample PUBSUB
Sample AMQSPUBA start
target topic is Sample
This is a sample
1111
2222
3333
end of sample text

Sample AMQSPUBA end


- Subscriberサンプル・プログラム amqssub側

[mqm@r50p ~/work]$ /opt/mqm/samp/bin/amqssub Sample PUBSUB
Sample AMQSSUBA start
Calling MQGET : 30 seconds wait time
message <This is a sample>
Calling MQGET : 30 seconds wait time
message <1111>
Calling MQGET : 30 seconds wait time
message <2222>
Calling MQGET : 30 seconds wait time
message <3333>
Calling MQGET : 30 seconds wait time
message <end of sample text>
Calling MQGET : 30 seconds wait time
no more messages
Sample AMQSSUBA end

(5) 空行を入力すると、Publisher側サンプル・プログラム amqspub は終了します。また30秒以上何もPublishされた情報を受信できないと、Subscriber側サンプル・プログラム amqssub も終了します。

** 興味のある方は、amqspub/amqssubで指定するTopicをいろいろ変えて実行したり、ワイルド・カード(#)を利用して実行(例 : amqssub # PUBSUB)などのパターンも試してみて下さい。

** 複数ブローカーをネットワーク接続したPublish/Subscribeシステムのテストを行う場合には、FixPackを適用してV7.0.0.2以降を利用して下さい




Statistics
0 Favorited
63 Views
0 Files
0 Shares
0 Downloads