IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  WebSphere  >

MQ設計虎の巻: 第5回「アプリケーションプログラムの作成」

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

ダウンロード


レベル: 初級

千原 成人, 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"に属するユーザーで行ってください。

  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 コマンドはすべて処理されました。
    




上に戻る


4. Sender & Consumer(一方向型)

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

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

sender: send.c
consumer: 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.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の対話モードを終了してください。

  3. メッセージの内容の確認
    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プログラムは以下のように動作します。

  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
     [mqm@r50p ~/work]$ 
    		            

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

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

実行結果の確認

  1. MQSCコマンドの開始
    コマンド・プロンプトより下記コマンドを実行し、MQSCコマンドの対話モードに入ります。

    runmqsc PTP

  2. キュー上のメッセージ数の確認
    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プログラムは、以下のように動作します。
    1. (MQCONN) キューマネージャーPTPに接続
    2. (MQOPEN) 出力用のリクエスト・キューPTP.REQをオープン
    3. (MQOPEN) 入力用のリプライ・キューPTP.REPをオープン
    4. メッセージをバッファーにセット
    5. (MQPUT) リクエスト・キューにメッセージを書き込む
    6. メッセージを受信するためのデータ・バッファーを初期化
    7. メッセージの識別に使用するための相関IDを指定
    8. (MQGET) リプライ・キューからメッセージを読み出す(最大15秒、メッセージの到着を待ちます)
    9. 受信したメッセージを画面に表示
    10. (MQCLOSE) リクエスト・キューをクローズ
    11. (MQCLOSE) リプライ・キューをクローズ
    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を利用
  8. (MQPUT1) メッセージをリプライ・キューに書き込む
  9. (MQCLOSE) リクエスト・キューをクローズ
  10. (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
  • 第二パラメータに、キュー・マネージャー名(省略した場合、デフォルト・キュー・マネージャーに接続)
を指定します。
  1. (MQCONN) 指定されたキュー・マネージャーとの接続を行います。
  2. (MQOPEN) 指定されたTOPICをオープンします。
  3. (MQPUT) コマンド・ラインから入力された文字列(99文字以内)を、TOPICへPublishします。
  4. ブランク行(何も入力せず、改行キーを押す)まで、入力された文字列をPublishします。
  5. (MQCLOSE) TOPICをクローズします。
  6. (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側 ("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]$
    

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

** 興味のある方は、amqspub/amqssubで指定するTopicをいろいろ変えて実行したり、ワイルド・カード(#)を利用して実行(例 : amqssub # PUBSUB)などのパターンも試してみて下さい。
** 複数ブローカーをネットワーク接続したPublish/Subscribeシステムのテストを行う場合には、FixPackを適用してV7.0.0.2以降を利用して下さい。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
sender: send.csend.c6 KBHTTP
consumer: consumer.cconsumer.c7 KBHTTP
request: request.crequest.c6 KBHTTP
reply: reply.creply.c6 KBHTTP
Publisher側: amqspuba.camqspuba.c14 KBHTTP
Subscriber側: amqssuba.camqssuba.c16 KBHTTP
ダウンロード形式について


参考文献



著者について

千原 成人, WebSphereテクニカル・セールス, 日本アイ・ビー・エム株式会社




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ