レベル: 初級 千原 成人, WebSphereテクニカル・セールス, IBM
2008年 2月 28日 更新 2009年 5月 29日 ご好評の記事、「MQ虎の巻」の久々の改訂版(V7対応)です。今回は第5回「アプリケーションプログラムの作成」を改訂いたしました。
1. アプリケーションプログラムの作成について
今回は、アプリケーションを作成する手順に焦点を当てて説明をします。
まず最初に各プラットフォームで使用可能なプログラム言語について説明します。
その後、サンプルアプリケーションを実際に作成していく手法を順を追って説明していきます。
今回はプラットフォームはLinux (RHEL 5)、プログラム言語はC(gccのバージョンは、4.1.2)を使って解説します。その他の環境については、下記のマニュアルを参考にして下さい。
2. MQアプリケーション作成に使用できる言語
WebSphere MQにて使用できるプログラミング言語は、以下のとおりです。
拡大図
サポートされるコンパイラーについて
"WebSphere MQ - System requirements" のページで、WebSphere MQが各プラットフォーム上でサポートするコンパイラーを確認できます。
例えば、WebSphere MQV7がAIXでサポートするコンパイラーを確認するためには、下のように"WebSphere MQ V7"を選択し、AIXのフィールドにある"Detailed system requirements for xxxxxx"をクリックします。

すると、WebSphere MQ V7がサポートするソフトウェアの一覧表が表示されます。この表の
- "For C/C++ applications"
- "For COBOL applications"
- "For Java applications using the WebSphere MQ classes for Java or JMS"
の欄を確認して下さい。(他のプラットフォームの場合、表示されるプログラム言語が異なる場合があります)
3. 環境の説明・準備作業
これ以降の説明はWebSphere MQ バージョン7.0と下記のソフトウェアを前提として進めていきます。
- OS:RedHat Enterprise Linux V5
- コンパイラー:gcc バージョン 4.1.2
またアプリケーションがアクセスするキューマネージャーおよびキューは、以下の構成および名称になります。

事前にキューマネージャーやキューを下記の手順で作成します。なお、作業はグループ"mqm"に属するユーザーで行ってください。
- キューマネージャーの作成
ターミナルを開いて、次のコマンドを実行し、キューマネージャーを作成します。
[mqm@r50p ~]$ crtmqm PTP
WebSphere MQ キュー・マネージャーが作成されました。
PTP のデフォルト・オブジェクトを作成または置換しています。
デフォルト・オブジェクトの統計 : 作成 58、置換 0、失敗 0
設定を完了中です。
設定が完了しました。 |
- キューマネージャーの開始
次のコマンドをターミナルから実行し、キューマネージャーを開始します。
[mqm@r50p ~]$ strmqm PTP
WebSphere MQ キュー・マネージャー 'PTP' を開始しています。
ログのやり直しフェーズ中に、キュー・マネージャー 'PTP' で 5 ログ・レコード がアクセスされました。
キュー・マネージャー 'PTP' のログのやり直しが完了しました。
キュー・マネージャー 'PTP' のトランザクション・マネージャーの状態が 回復されました。キュー・マネージャー 'PTP' が始動しました。 |
- キューの定義
テキスト・エディターを使って、下記の内容のファイルを作成し、"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 コマンドはすべて処理されました。
|

 |
4. Sender & Consumer(一方向型)
この節では、一方向型のメッセージ転送を行うSenderとConsumerという二つのプログラムを作成し、実行する手順を紹介します。
下記のソースプログラムを適当なディレクトリーにコピーして下さい。以降の説明では、ホーム・ディレクトリーに"work"というディレクトリーを作成し、"~/work/"へこれらをコピーしたものとして実行結果等を掲載しています。
sender: send.c
consumer: consumer.c
Senderプログラムの機能
指定したキューに"This is a simple Send/Forget sample"という内容のテキストデータをメッセージとして書き込んで終了するプログラムです。
プログラムの動作の流れは以下の通りになります。
- (MQCONN) キューマネージャーPTPに接続
- (MQOPEN) PTP.LQキューをメッセージを書き出すためのキューとしてオープン
- メッセージをバッファーにセット
- (MQPUT) オープンされたキューに対してメッセージを書き出す
- (MQCLOSE) キューPTP.LQをクローズ
- (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"にメッセージが書き込まれました。
実行結果の確認
MQSCコマンドの開始
ターミナルより下記コマンドを実行し、MQSCコマンドの対話モードに入ります。
runmqsc PTP
- キュー上のメッセージ数の確認
MQSCコマンドの対話モードにて、次のコマンドを入力すると、キューに保持されているメッセージ数を確認できます。この値が"send.exe"実行前より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の対話モードを終了してください。
- メッセージの内容の確認
WebSphere MQのサンプル・プログラム "/opt/mqm/samp/bin/amqsgbr"を利用して、実際にキューの中に正しくメッセージが書き込まれたことを確認します。
/opt/mqm/samp/bin/amqsgbr PTP.LQ PTP 下記のような実行結果が得られます。
[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
[mqm@r50p ~/work]$
|
Consumerプログラムの機能
キューから、メッセージを1つだけ取得するCプログラムです。
Senderプログラムはメッセージの送り手、Consumerプログラムはメッセージの受け手として動作します。
ここで使用するComsumerプログラムは以下のように動作します。
- (MQCONN) キューマネージャーPTPに接続
- (MQOPEN) PTP.LQキューをメッセージを取り出すためのキューとしてオープン
- メッセージを読み込むためのデータバッファを確保
- (MQGET) オープンしたキューからメッセージの取り出し
- 取り出したメッセージを画面に表示
- (MQCLOSE) キューPTP.LQをクローズ
- (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"という実行ファイルが生成されます。
実行方法
ターミナルで先に作成した"send"を実行しておき、キュー "PTP.LQ" にメッセージが存在する状態にしておきます。
- ターミナルより、"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
[mqm@r50p ~/work]$
|
これにより、メッセージがキューから取り出された事になります。
キューにメッセージが存在しない状態でこのプログラムを実行すると、15秒後に下記のようなメッセージが表示されます。
[mqm@r50p ~/work]$ ./consumer
Consumer sample
no more messages
sample Consumer program end
|
実行結果の確認
MQSCコマンドの開始
コマンド・プロンプトより下記コマンドを実行し、MQSCコマンドの対話モードに入ります。
runmqsc PTP
- キュー上のメッセージ数の確認
MQSCコマンドの対話モードにて、次のコマンドを入力すると、キューに保持されているメッセージ数が表示されます。この値が"consumer.exe"実行前より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の対話モードを終了してください。
5. Request & Reply(双方向型)
この節では、双方向型のメッセージ転送を行うRequestとReplyとうい二つのプログラムを作成し、実行する手順を紹介します。
下記のソースプログラムを適当なディレクトリーにコピーして下さい。
request: request.c
reply: reply.c
Requestプログラムの機能
このサンプル・プログラム"request"は、
- 指定したキューに"This is a simple Request/Reply sample"という内容のテキストデータをメッセージとして送信(メッセージを "PTP.REQ" キューに書き込む)
- 指定したリプライ・キュー "PTP.REP" にその応答メッセージが到着するのを待機
- 応答メッセージが到着したら受信し、それを画面に表示してから終了するCプログラムです。Requestプログラムは、以下のように動作します。
- (MQCONN) キューマネージャーPTPに接続
- (MQOPEN) 出力用のリクエスト・キューPTP.REQをオープン
- (MQOPEN) 入力用のリプライ・キューPTP.REPをオープン
- メッセージをバッファーにセット
- (MQPUT) リクエスト・キューにメッセージを書き込む
- メッセージを受信するためのデータ・バッファーを初期化
- メッセージの識別に使用するための相関IDを指定
- (MQGET) リプライ・キューからメッセージを読み出す(最大15秒、メッセージの到着を待ちます)
- 受信したメッセージを画面に表示
- (MQCLOSE) リクエスト・キューをクローズ
- (MQCLOSE) リプライ・キューをクローズ
- (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プログラムは、以下のように動作します
- (MQCONN) キューマネージャーPTPに接続
- (MQOPEN) 入力用のリクエスト・キューPTP.REQをオープン
- メッセージを受信するためのデータ・バッファーを初期化
- (MQGET) リクエスト・キューからメッセージを読み出す(メッセージが到着するまで永久に待ち続けます)
- 受信したメッセージ・データを画面に表示
- 送信用のメッセージを用意
- メッセージの識別に使用するための相関IDを指定
- リプライ・キュー名は、リクエスト・メッセージから入手
- リクエスト・メッセージのメッセージIDを利用
- (MQPUT1) メッセージをリプライ・キューに書き込む
- (MQCLOSE) リクエスト・キューをクローズ
- (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.exe"と"reply.exe"が正常に双方向型(要求・応答型)の処理を完了した事を示します。
一方、"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 Req
uest/Reply>
The replay queue is PTP.REP
Request/Reply Sample end
|
これは、キュー "PTP.REQ" にメッセージの到着を待っていた"reply"が正常にメッセージを受け取り、応答のメッセージをリプライ・キュー "PTP.REP" に書き込んだ事を示します。
6. 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では、キュー・マネージャーの開始とともに起動するプロセス "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属性になります。
[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を呼び出します。

ここで、
- MQOPENとMQCLOSEの対象.
- メッセージをMQPUTする対象.
がTopicまたはTopicストリングである点を除くと、このAPIの流れはメッセージをキューにMQPUTするアプリケーションと同じロジックになります。
これに対して、SubscriberはTopicから情報を入手し利用するプログラムで、以下のようなAPIを利用します。

この流れの中では、
- MQSUBという新しいAPIを利用して、TopicまたはTopicストリングへ接続 (MQOPENではない).
- MQCLOSEを二回利用.
という特徴があります。
(2) 準備 (以降の作業は、ユーザー "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側: amqspuba.c
Subscriber側: amqssuba.c
Publisherプログラムの機能
amqspubは、
- 第一パラメータに、オープンするTopic
- 第二パラメータに、キュー・マネージャー名(省略した場合、デフォルト・キュー・マネージャーに接続)
を指定します。
- (MQCONN) 指定されたキュー・マネージャーとの接続を行います。
- (MQOPEN) 指定されたTOPICをオープンします。
- (MQPUT) コマンド・ラインから入力された文字列(99文字以内)を、TOPICへPublishします。
- ブランク行(何も入力せず、改行キーを押す)まで、入力された文字列をPublishします。
- (MQCLOSE) TOPICをクローズします。
- (MQDISC) キュー・マネージャーからの切断を行います。
Subscriberプログラムの機能
amqssubは、
- 第一パラメータに、オープンするTopic
- 第二パラメータに、キュー・マネージャー名(省略した場合、デフォルト・キュー・マネージャーに接続)
を指定します。
- (MQCONN) 指定されたキュー・マネージャーとの接続を行います。
- (MQSUB) Brokerに対して、指定されたTopicに対するSubscriberとして登録を行います。このAPIにより、
- 内部的にキューがオープンされ、そのキューに対するオブジェクト・ハンドル (HObj)
- Subscribeするためのオブジェクト・ハンドル (HSub)
が、プログラムに戻ります。
- (MQGET) 登録したTopicに対してPublishされたメッセージを、Brokerから受け取ります。
- 受け取ったメッセージを、画面に表示します。
- (MQCLOSE) Subscribeのためのオブジェクト・ハンドル(HSub)を解放することで、Subscriptionをクローズします。
- (MQCLOSE) 内部的に利用していたキューをクローズします。(HObjの解放を実行)
- (MQDISC) キュー・マネージャーからの切断を行います。
実行方法
- ターミナルを、3つ開きます。
- 一つのターミナルはPublisher側サンプル amqspub用に、残りのターミナルはSubscriber側サンプル・プログラム amqssub用に使います。
- ターミナルの一つで、Publisher側サンプル・プログラム amqspub を
- 第一パラメータに、先ほど作成したTopic "Sample"
- 第二パラメータに、キュー・マネージャー名 "PUBSUB"
を指定して実行します。入力待ち状態になりますので、そのままにしておきます。
[mqm@r50p ~]$ /opt/mqm/samp/bin/amqspub Sample PUBSUB
Sample AMQSPUBA start
target topic is Sample
|
- 残りのターミナルで、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 |
入力待ち状態になっているPublisher側サンプル・プログラム amqspub に、適当なメッセージをいくつか入力します。すると、Subscriber側サンプル・プログラム amqssub を実行しているターミナル上に、ほぼ同時に同じメッセージが表示されます。
Publisherサンプル・プログラム amqspub側 ("This is a sample"から"end of sample text"までが入力した文字)
[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
[mqm@r50p ~]$
|
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
[mqm@r50p ~/work]$
|
- 空行を入力すると、Publisher側サンプル・プログラム amqspub は終了します。また30秒以上何もPublishされた情報を受信できないと、Subscriber側サンプル・プログラム amqssub も終了します。
** 興味のある方は、amqspub/amqssubで指定するTopicをいろいろ変えて実行したり、ワイルド・カード(#)を利用して実行(例 : amqssub # PUBSUB)などのパターンも試してみて下さい。
** 複数ブローカーをネットワーク接続したPublish/Subscribeシステムのテストを行う場合には、FixPackを適用してV7.0.0.2以降を利用して下さい。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| sender: send.c | send.c | 6 KB | HTTP |
|---|
| consumer: consumer.c | consumer.c | 7 KB | HTTP |
|---|
| request: request.c | request.c | 6 KB | HTTP |
|---|
| reply: reply.c | reply.c | 6 KB | HTTP |
|---|
| Publisher側: amqspuba.c | amqspuba.c | 14 KB | HTTP |
|---|
| Subscriber側: amqssuba.c | amqssuba.c | 16 KB | HTTP |
|---|
参考文献
著者について  | |  | 千原 成人, WebSphereテクニカル・セールス, 日本アイ・ビー・エム株式会社 |
記事の評価
|