...

アプリケーション MQ トピック 機能と構成

by user

on
Category: Documents
122

views

Report

Comments

Transcript

アプリケーション MQ トピック 機能と構成
WebSphere MQ v7.0 機能と構成
MQアプリケーション
ISE エンタープライズ・ミドルウェア
2009年07月
トピック
MQアプリケーションの構造
メッセージ
MQI
API一覧
MQIを用いたアプリケーションの流れ
サンプル
MQのJava インターフェース
Base java
Base
javaについて
主要なクラスの説明
Base
javaを用いたアプリケーションの流れ
サンプル
JMS
JMSについて
主要なクラスの説明
JMSを用いたアプリケーションの流れ
サンプル
2
MQアプリケーションの構造
キューに対してPUT/GETを行う代表的なMQアプリケーションの流れ
初期化処理
初期化処理
キュー・マネージャーに接続
キュー・マネージャーに接続
キューをオープン
メイン・ロジック
キューをオープン
キューにメッセージを書き込み
キューからメッセージを読み込み
メイン・ロジック
終了処理
メッセージの書き込み
キューをクローズ
キュー・マネージャーとの接続を切断
メッセージの読み込み
MQが提供するAPI
MQI(Message Queueing Interface)
終了処理
MQ標準のAPI
C,
C++, COBOL, Javaをはじめ多数の言語をサポート
JMS(Java Message Service)
Java環境での標準メッセージング・インターフェース
キューのクローズ
キュー・マネージャーと切断
3
メッセージ
キューを介してプログラム間で送受信されるデータ
メッセージの構成
MQMD
メッセージ・ヘッダー(MQMD)
ユーザー・データ
メッセージ・ヘッダー
ユーザー・データ
アプリケーション・データ
キュー・マネージャーは最大100MBまでのユーザー・データを処理可能
MQMD
メッセージの識別情報やメッセージの制御情報などを含むメッセージ・ヘッダー
MQMDの主なフィールド
フィールド
説明
Report
レポート・メッセージを受け取るための指定
MsgType
扱うメッセージのタイプ
Expiry
メッセージの有効期限
CodedCharSetID
ユーザー・データのCCSID
Format
ユーザー・データのフォーマット
Priority
メッセージの優先順位
Persistence
メッセージの永続性
MsgID / CorrelID
メッセージの識別ID
ReplyToQ /
ReplyToQMgr
サーバ応答先やレポート・メッセージの送信先
4
MQI
MQI(Message Queuing Interface)
MQの標準API
多数の言語から同一のインターフェースでプログラミング可能
稼動環境(プラットフォーム、ネットワーク・プロトコル)の違いを吸収
メッセージの読み書き、同期点制御を始めとする様々なロジックを提供
MQIが使用できる開発言語のサポート状況
AIX
HP-UX
Solaris
Linux(Intel)
Windows
z/OS
i5/OS
C
○
○
○
○
○
○
○
C++
○
○
○
○
○
○
○
COBOL
○
○
○
-
○
○
○
PL/I
○(v5.3まで)
-
-
-
○(v5.3まで)
○
-
VB
-
-
-
-
○(※)
-
-
ActiveX
-
-
-
-
○(※)
-
-
.NET
-
-
-
-
○
-
-
Base Java
○
○
○
○
○
○
○
RPG
-
-
-
-
-
-
○
Assembler
-
-
-
-
-
○
-
※v6.0までの機能をサポート
5
MQI一覧
MQIの一覧と役割ごとの分類
キュー・マネージャーとの接続/切断
MQCONN
キューマネージャーに接続
MQCONNX キューマネージャーに接続(拡張)
MQDISC
キューマネージャーから接続
キューのオープン/クローズ
MQOPEN
キューをオープン
MQCLOSE キューをクローズ
メッセージの読み/書き
MQPUT
メッセージを書き込む
MQGET
メッセージを読み込む
MQPUT1
キューをオープンしてメッセージを1つ書
き込む
オブジェクト定義情報の紹介/更新
MQSET
属性を設定
MQINQ
属性を参照
作業単位(UOW)制御
MQCMIT
UOWをコミット
MQBACK UOWをバックアウト
MQBEGIN
グローバルトランザクションを開始
6
Pub/Sub
MQSUB
MQSUBRQ
メッセージ・プロパティ
MQSETMP
MQINQMP
MQDLTMP
MQCRTMH
MQDLTMH
MQBUFMH
MQMHBUF
非同期メッセージ受信
MQCB
MQCTL
サブスクリプション登録
リテインメッセージ受信をリクエスト
メッセージ・プロパティを設定
メッセージ・プロパティを参照
メッセージ・プロパティを削除
メッセージ・ハンドルを作成
メッセージ・ハンドルを削除
バッファをメッセージ・ハンドルに変換
メッセージ・ハンドルをバッファに変換
コールバック関数の登録
コールバック関数の制御
(開始/停止)
MQCB_FUNCTION コールバック関数の登録(CICS用)
非同期メッセージ送信
MQSTAT
非同期メッセージ受信状況の確認
MQIが提供する主な構造体とデータ・タイプ
主な構造体
構造体
MQOD
主な使用目的
オープンするキュー名の指定(ObjectName)
メッセージの属性
(永続性などのキュー・マネージャーに対するメッセージの取り扱い方法の指示など)
メッセージの送信方法に関するオプション。同期点処理の要否など
メッセージの受信方法に関するオプション。
同期点処理の要否、受信待機の要否、待機時間 など
MQMD
MQPMO
MQGMO
主なデ-タ・タイプ
データ・タイプ
MQBYTE
MQBYTEn
MQCHAR
MQCHARn
MQHCONN
MQHOBJ
MQLONG
説明
1バイトのバイナリ・データ
nバイトのバイナリ・データ
1文字の文字列ストリング
n文字の文字列ストリング
コネクション・ハンドル(実際のデ-タ・タイプはMQLONG)
オブジェクト・ハンドル(実際のデ-タ・タイプはMQLONG)
フル・ワ-ド整数
7
MQIを用いたプログラミングの流れ
MQIを用いた、キューに対してPUT/GETを行う代表的なMQアプリケーションの流れ
キュー・マネージャー、キューに対するそれぞれの処理に対応するMQIを使用
キュー・マネージャー、キューとの接続には、コネクション・ハンドル、オブジェクトハンドルが必要
MQアプリケーション
キュー・マネージャー
初期化処理
キュー・マネージャーに接続
コネクション・
ハンドル
MQCONN
キューをオープン
MQOPEN
オブジェクト・
ハンドル
メイン・ロジック
メッセージの書き込み
MQPUT
メッセージの読み込み
MQGET
終了処理
キューのクローズ
キュー・マネージャーと切断
MQCLOSE
MQDISC
8
MQCONN
キュー・マネージャーとの接続に用いる関数
キュー・マネージャーとの接続に成功すると、コネクション・ハンドルが返る
アプリケーションとキュー・マネージャーとの接続を識別するためのハンドル
後続のAPIを呼び出す際には、コネクション・ハンドルが必須
指定するパラメータ
接続先キュー・マネージャー名
MQCONN
キュー・マネージャー
キュー・マネージャー名
コネクション・
ハンドル
コネクション・ハンドル
完了コード
理由コード
※完了コード
• 実行結果(正常終了/異常終了/エラー)
※理由コード
• エラーや警告の理由を表す値
9
MQOPEN
キューをはじめとするMQオブジェクトをオープンするため関数
MQオブジェクトのオープンに成功すると、オブジェクトハンドルが返る
MQオブジェクトとの接続を識別するためのハンドル
オブジェクトに対する操作には、オブジェクト・ハンドルが必須
オブジェクト毎にMQOPENを呼び出すことが必要
送信用、受信用キューを使用する場合は2回MQOPENをする必要がある
指定するパラメータ
MQOD構造体: オブジェクト名、オブジェクトのタイプを指定
オープン・オプション: オブジェクトの使用目的(書き込み用、読み込み用)などを指定
MQOPEN
キュー・マネージャー
コネクション・ハンドル
コネクション・
ハンドル
MQOD構造体
オープン・オプション
オブジェクト・
ハンドル
オブジェクト・ハンドル
完了コード
理由コード
10
MQPUT
キューにメッセージを書き込みむための関数
指定するパラメータ
MQMD構造体: メッセージ・ヘッダー(MQMD)に相当する構造体
優先度/メッセージ・タイプ/永続性などを指定
MQPMO構造体: MQPUTを制御するための各種オプションを設定
メッセージを同期点処理の対象にするか
メッセージIDを新規に割り当てるか
など
PUTするメッセージを格納するバッファーとメッセージ長
MQPUT
コネクション・
ハンドル
コネクション・ハンドル
キュー・マネージャー
オブジェクト・
ハンドル
オブジェクト・ハンドル
MQMD構造体
MQPMO構造体
メッセージ長
バッファー
完了コード
理由コード
11
MQGET
キューからメッセージを読込む関数
指定したバッファーにキューから読み込んだメッセージのユーザー・データが格納される
MQMD構造体には読み込んだメッセージのヘッダ部分がコピーされる
指定するパラメータ
MQMD構造体: キューから特定のメッセージを読み込む場合に指定
MQGMO構造体: MQGETを制御するための各種オプションを設定
メッセージを同期点処理の対象にするか
メッセージのコード変換
GET_Waitの指定 など
MQGET
コネクション・ハンドル
オブジェクト・ハンドル
コネクション・
ハンドル
オブジェクト・
ハンドル
MQMD構造体
MQGMO構造体
バッファー長
バッファー
データ長
完了コード
理由コード
12
キュー・マネージャー
MQCLOSE
オープンしているMQオブジェクトをクローズするための関数
MQOPENで入手したオブジェクト・ハンドルを解放
一旦クローズしたMQオブジェクトを利用するためには、再度MQOPENが必要
指定するパラメータ
クローズ・オプション: 動的キューの削除設定などを指定
MQCLOSE
キュー・マネージャー
コネクション・ハンドル
オブジェクト・ハンドル
コネクション・
ハンドル
オブジェクト・
ハンドル
クローズ・オプション
完了コード
理由コード
13
MQDISC
アプリケーションとキュー・マネージャーとの接続を切断する関数
MQCONNで入手したコネクションハンドルの開放
一旦切断したキュー・マネージャーへの接続には、再度MQCONNが必要
MQDISC
キュー・マネージャー
コネクション・ハンドル
コネクション・
ハンドル
完了コード
理由コード
14
<参考>MQCMIT
作業単位(UOW)内のPUT/GET処理を確定(COMMIT)するための関数
動作
PUT処理の場合
COMMITされるまで、同期点処理の対象メッセージは、他のアプリケーションからは読み込み不可
COMMITされると、他のアプリーションが読み取ることが可能になる
GET処理の場合
COMMITされるまで、同期点処理の対象メッセージは、キューに残る
–他のアプリケーションからはアクセス不可
COMMITされると、キューからメッセージが消去される
指定するパラメータ
コネクション・ハンドル
MQCMIT
キュー・マネージャー
コネクション・ハンドル
コネクション・
ハンドル
完了コード
理由コード
15
<参考>MQBACK
作業単位(UOW)内のPUT/GET処理を取り消す(ROLLBACK)するための関数
動作
PUT処理の場合
COMMITされるまで、同期点処理の対象メッセージは、他のアプリケーションからは読み込み不可
ROLLBACKされると、PUTされたメッセージはすべてキューから削除される
GET処理の場合
COMMITされるまで、同期点処理の対象メッセージは、キューに残る
ROLLBACKされると、GETされたメッセージはすべてキューに復元される
指定するパラメータ
コネクション・ハンドル
MQBACK
キュー・マネージャー
コネクション・
ハンドル
コネクション・ハンドル
完了コード
理由コード
16
MQIを用いたプログラミングの手順のまとめ
MQアプリケーション
初期化処理
定数、MQ構造体、
メッセージバッファの宣言
キュー・マネージャーと接続
MQCONN
キュー・マネージャー
MQOPEN
キューのオープン
メイン・ロジック
メッセージの作成
ユーザー・データ
MQPMO
(MQGMO)
送信オプションの指定
(受信オプションの指定)
メッセージの送信
(メッセージの受信)
MQPUT/(MQGET)
MQCMIT/MQBACK
(同期点処理)
終了処理
MQCLOSE
キューのクローズ
MQDISC
キュー・マネージャーから切断
17
サンプル・コード(C言語)
キュー・マネージャーTESTQMに接続し、キューQLにテストメッセージをPUT/GET
#include <cmqc.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
MQOD
od = {MQOD_DEFAULT};
MQMD
md_put = {MQMD_DEFAULT};
MQMD
md_get = {MQMD_DEFAULT};
MQPMO pmo = {MQPMO_DEFAULT};
MQGMO gmo = {MQGMO_DEFAULT};
・・・・1
・・・・2
MQHCONN Hcon;
MQHOBJ Hobj;
MQLONG O_options,C_options;
MQLONG CompCode, Reason;
MQLONG messlen,buflen;
char
buffer_put[1024];
char
buffer_get[1024];
char
QMName[50];
・・・・3
strcpy(QMName, "TESTQM");
MQCONN(QMName, &Hcon, &CompCode, &Reason);
・・・・4
strncpy(od.ObjectName, "QL", (size_t)MQ_Q_NAME_LENGTH);
O_options = MQOO_OUTPUT | MQOO_INPUT_SHARED| MQOO_FAIL_IF_QUIESCING ;
MQOPEN(Hcon, &od, O_options, &Hobj, &CompCode, &Reason);
18
・・・・5
・・・・6
サンプル・コード( C言語)
memcpy(md_put.Format, MQFMT_STRING, (size_t)MQ_FORMAT_LENGTH);
pmo.Options = MQPMO_NO_SYNCPOINT | MQPMO_FAIL_IF_QUIESCING; ・・・・7
strcpy(buffer_put,"test message");
messlen = strlen(buffer_put);
memcpy(md_put.MsgId, MQMI_NONE, sizeof(md_put.MsgId) );
memcpy(md_put.CorrelId, MQCI_NONE, sizeof(md_put.CorrelId) );
MQPUT(Hcon, Hobj, &md_put, &pmo, messlen, buffer_put, &CompCode, &Reason);
gmo.Options = MQGMO_WAIT + MQGMO_ACCEPT_TRUNCATED_MSG;
gmo.WaitInterval = 15000;
・・・・10
buflen = sizeof(buffer_get) - 1;
・・・・8
・・・・9
memcpy(md_get.MsgId, MQMI_NONE, sizeof(md_get.MsgId));
memcpy(md_get.CorrelId, MQCI_NONE, sizeof(md_get.CorrelId));
md_get.Encoding
= MQENC_NATIVE;
md_get.CodedCharSetId = MQCCSI_Q_MGR;
MQGET(Hcon, Hobj, &md_get, &gmo, buflen, buffer_get, &messlen, &CompCode, &Reason);
buffer_get[messlen] = '¥0';
printf("message <%s>¥n", buffer_get);
MQCLOSE(Hcon, &Hobj, C_options, &CompCode, &Reason);
・・・・12
MQDISC(&Hcon, &CompCode, &Reason);
・・・・13
return(0);
・・・・11
}
※エラー・ハンドリングは含まれていません
19
サンプル・コード( C言語)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ヘッダー・ファイルcmqc.hのインクルード
各種構造体の宣言
各種変数の宣言
MQCONNよりキュー・マネージャーTESTQMとの接続を開始
オープン・オプションの設定
MQOPENよりキューQLのオープン
MQPMOのPUTオプションを設定(ノン・パーシステント)
MQPUTよりメッセージをQLに書き込み
MQGMOのGETオプションを設定(待機受信設定)
GETの待機時間を15秒に設定
MQGETよりメッセージをQLから読み込み
キューをクローズ
キュー・マネージャから切断
20
主要なサンプル・プログラム( C言語)
MQ提供のサンプル・プログラム
ソースファイル
実行モジュール
実行モジュール(MQクライアント)
メッセージの書き込み
amqsput0.c
amqsput
amqsputc
メッセージの読み取り
amqsget0.c
amqsget
amqsgetc
メッセージのブラウズ
amqsgbr0.c
amqsgbr
amqsgbrc
メッセージのブラウズ
amqsbcg0.c
amqsbcg
amqsbcgc
配置ディレクトリー
UNIX系:
Windows:
/usr/mqm/samp
<導入ディレクトリ>¥Tools¥C¥Samples
21
MQのJava インターフェース
MQ Base Java
WebSphere MQ(MQ)専用のメッセージング・インターフェース
MQI(Message Queuing Interface)そのままのイメージでコーディング可能
Java Message Service(JMS)
J2EE標準のメッセージング・インターフェース
サポートするアプリケーション・サーバー
IBM WebSphere Application Server(WAS)
BEA WebLogic Server
MQ JMSリソースアダプター
WebSphere MQ
classes for JMS
(JMS)
WebSphere MQ
classes for Java
(Base Java)
MQIへの共通Javaインターフェース
クライアント
接続
バインディング
接続
キュー・マネージャー
JCA 1.5対応のMQリソースアダプター
MQ v6.0.2.1から(z/OS版を除く)
J2EE 1.4対応のすべてのアプリケーション・サーバーでMQ JMS接続がサポートされる
Message Driven Bean(MDB)
J2EE標準のメッセージ駆動型処理を行うEJB
JMSの機能を使用して実装
22
MQ Base Java
WebSphere MQが提供するIBM独自のJavaインターフェース
従来のMQIと同じプログラミング手順、デザインが可能
既存のMQシステムとの相性がよい
標準的なMQI機能のサポート
MQIがサポートする機能はすべて使用可能
同期点制御、メッセージID / 相関IDの利用、レポート・オプション、MQクラスターなど
データベース・コーディネーション機能
MQがコーディネータで、メッセージとDBの2フェーズコミットを行なう
グローバル・トランザクションには参加できない(= WASがコーディネータ)
メッセージ取り出し/書き込みのためのメソッドを提供
readString、readLine、writeString、writeInt など
MQローカル接続 / クライアント接続が可能
MQクライアントの導入は不要
キュー・マネージャー
アプリケーション
(クライアント接続)
アプリケーション
(ローカル接続)
MQI
MQI
23
主要API
Base Javaが提供する主なクラスとメソッド
クラス
MQEnvironment
MQQueueManager
MQQueue
MQMessage
用途とメソッド
CCSIDやクライアント接続情報などのMQ環境を設定
・キュー・マネージャーへの接続
・主なメソッド
-accessQueue()
-disconnect()
-begin()
-commit()
-backout()
・キューへの接続
・主なメソッド
-put()、get()
-close()
・メッセージ
・MQMDに相当するフィールドを持つ
・主なメソッド
-readString(), writeStrig()
MQPutMessageOptions
MQGetMessageOptions
MQConstants
MQExceptoin
MQPUT時のオプション(MQPMO)
MQGET時のオプション(MQGMO)
各種オプションを表す定数
MQ関連処理中の例外処理
24
MQ Base Javaのプログラミング手順
MQアプリケーション
初期化処理
com.ibm.mq.*
パッケージのインポート
基本的な処理の流れは
MQIを用いたアプリケーションと同様
接続環境の設定
キュー・マネージャーと接続
new MQQueueManager()
キュー・マネージャー
accessQueue()
キューのオープン
MQQueue()
メイン・ロジック
メッセージの作成
new MQMessage()
送信オプションの指定
(受信オプションの指定)
new MQPutMessageOptions()
new MQGetMessageOptions()
メッセージの送信
(メッセージの受信)
put()
get()
commit/backout
(同期点処理)
終了処理
キューのクローズ
close()
キュー・マネージャーから切断
disconnect()
25
サンプル・コード(Base Java)
import com.ibm.mq.*;
・・・・・・・・・・・・・・・・・・・・・・・・・1
public static void main(String args[]){
try{
・・・・・・・・・・・・・・・・・・・・・・・・・ 2
MQQueueManager qmgr = new MQQueueManager("QMgrName");
int openOption = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;
MQQueue queue = qmgr.accessQueue("QueueName", openOption); ・・・・・・・・・・・・・・・・・・・・・・・・・ 3
MQMessage putMessage = new MQMessage();
putMessage.priority = 5;
・・・・・・・・・・・・・・・・・・・・・・・・・ 4
putMessage.characterSet = 943;
putMessage.writeString("This is a message");
MQPutMessageOptions mqpmo = new MQPutMessageOptions();
・・・・・・・・・・・・・・・・・・・・・・・・・ 5
mqpmo.options = MQC.MQPMO_NO_SYNCPOINT;
・・・・・・・・・・・・・・・・・・・・・・・・・ 6
queues.put(putMessage, mqpmo);
MQMessage getMessage = new MQMessage();
・・・・・・・・・・・・・・・・・・・・・・・・・ 7
MQGetMessageOptions mqgmo = new MQGetMessageOptions();
・・・・・・・・・・・・・・・・・・・・・・・・・ 8
queue.get(getMessage, mqgmo);
・・・・・・・・・・・・・・・・・・・・・・・・・ 9
String strMessage = getMessage.readString(17);
・・・・・・・・・・・・・・・・・・・・・・・・・10
System.out.println(strMessage);
queue.close();
・・・・・・・・・・・・・・・・・・・・・・・・・11
qmgr.disconnect();
・・・・・・・・・・・・・・・・・・・・・・・・・12
} catch(MQException ex) {
System.out.println("MQException occurred¥ncc:" +
ex.completionCode +
"¥nrc:" + ex.reasonCode);
} catch(java.io.IOException ex){
System.out.println("IOException occurred");
}
}
}
26
サンプル・コード(Base Java)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
パッケージ・ファイルのインポート : com.ibm.mq.*
キュー・マネージャ・オブジェクトを作成し、「QMgrName」に接続
キュー・オブジェクトを取得することで、「QueueName」のオープン
MQMD作成、priority=5、CCSID=943(S-JIS)に指定してメッセージ・オブジェクトを作成
MQPMO作成、同期点処理無しに設定
メッセージPUT
MQMDをデフォルトの設定でメッセージ・オブジェクトを作成
MQGMOをデフォルトの設定で作成
同一のキューからメッセージGET
メッセージ・オブジェクトからメッセージを取得
キューをクローズ
キュー・マネージャから切断
27
主要なサンプル・プログラム(Base Java)
MQ提供のサンプル・プログラム
メッセージの書き込み + 読み込み
ソース:
MQTest.java
コンパイル済みファイル: MQTest.class
配置ディレクトリー
UNIX系:
/usr/mqm/samp/wmqjava/samples
Windows: <導入ディレクトリ>¥Tools¥wmqjava¥Samples
28
Java Message Service(JMS)
Java環境での標準メッセージング・インターフェース
サン・マイクロシステムズ㈱が中心となって標準化されたAPI仕様
製品に依存しないアプリケーション構築が可能 アプリケーション・ポータビリティ
プロバイダー間の相互接続については保障されていない
各ベンダーが提供するメッセージング製品にて実装される
JMSプロバイダー(Provider)
JMSクライアントの実行環境を提供する
メッセージング製品のJMSの実装クラスを提供
JMSプロバイダー
JMSクライアント(Client)
JMSインターフェースにより、メッセージ・サービス
を使用するアプリケーション
JMS
クライアント
2つのドメイン
MQ
JMS
Point to point(PTP)
“キュー宛先”に対してメッセージを送受信するモデル
Publish/Subscribe(Pub/Sub)
他社メッセー
ジング製品
JMS
JMS
クライアント
他社メッセー
ジング製品
メッセージング・サービス
“トピック宛先“に対してメッセージを送受信するモデル
29
MQ JMS
MQはJMSプロバイダーとしての機能をもつ
MQにアクセス可能な、JMSインターフェースを実装したJavaクラスを提供
MQローカル接続 / クライアント接続が可能:MQクライアントの導入は不要
PTPとPub/Subモデルをサポート
Pub/SubブローカーエンジンもMQが提供
JMS特有の機能を提供
メッセージ・リスナー、メッセージ・セレクター、豊富なメッセージ・クラスの提供など
グローバル・トランザクションに参加可能
TPモニタ(WAS、WebLogic)の配下で、MQがリソース・マネージャーとして2フェーズコミットに参加
MQデータベース・コーディネーション機能はサポートされていない(MQはコーディネータになれない)
MQがサポートする機能は、ほぼ使用可能
使用できない機能
グループ・メッセージ、キューの属性照会(MQINQ)、コンテキスト情報の利用、PCFコマンドなど
プロバイダ固有のクラス、インターフェースを提供
アプリケーションのポータビリティは、損なわれる
JMSに準拠したプログラミング手順、デザインが必要
MQIと同様なプログラミング手順、デザインはできない
既存のMQアプリケーションと接続する場合は注意が必要
30
JMSメッセージ
JMSクライアント、JMSプロバイダー間でやり取りされるメッセージ
JMSで扱うメッセージの構成は、MQメッセージと若干異なる
メッセージの構成
ヘッダ
プロパティー
ボディー
ヘッダ:メッセージの識別情報やメッセージの制御情報などを含む
プロパティー:ヘッダに加え、付加的な情報を保持するフィールド
ボディー:ユーザーデータを保持
BytesMessage/TextMessage/MapMessage/StreamMessage/ObjectMessageの5タイプをサポート
JMSクライアントがMQに書き込んだメッセージは、MQメッセージにマップおよびコピーされる
JMSアプリケーション
JMSアプリケーション
JMSメッセージ
ヘッダー
マップ
プロパティ
データ
MQメッセージ
MQMD
マップ
RFH2
データ
コピー
コピー
JMSメッセージ
ヘッダー
プロパティ
データ
MQメッセージ(MQMD)に存在しないJMSヘッダのフィールドは、MQRFH2ヘッダーに付与
例) JMSヘッダ
MQMD
MQRFH2
JMSDestination
-
Dest
JMSMessageID
MsgId
-
JMSCorrelationID
CorrelID
Cid
31
JMS管理オブジェクト
JMSプロバイダーに接続するための情報を持つ、Javaオブジェクト
各社のメッセージング製品に関する情報を、JMSクライアントから切り離し、
アプリケーションのポータビリティーを高めることを目的
JNDIネーム・スペースに格納される
ファイル、LDAP、WASネーミング・サービス
JMSクライアントは実行時にネーム・スペースにアクセスし、オブジェクトを取得
JMS管理オブジェクト
コネクション・ファクトリー
ConnectionFactory
宛先
MessageProducer
/ MessageConsumer
プロバイダーが用意する管理ツールで登録、および属性の設定、変更
JMSAdminコマンド(MQが提供)
WAS管理コンソール
JNDIネームスペース
コネクション・ファクトリー
QMgr名
取得
32
JMS
クライアント
宛先キュー・トピック名
登録
JMSAdmin
WAS管理コンソール
主要API
JMSが提供する主なクラスとメソッド
クラス
ConnectionFactory
用途とメソッド
・JMSクライアント(JMSアプリケーション)がJMSプロバイダーとの接続に必要とな
る情報を設定
・主なメソッド
- createConnection()
- createSession()
Destination
Connection
Session
メッセージの送信先/受信先のキューやトピックを表すクラス
JMSクライアントがJMSプロバイダーとの接続を管理するオブジェクト
・送信されるメッセージの順序、トランザクションを管理するオブジェクト
・主なメソッド
- createProducer()
- createConsumer()
MessageProducer
・メッセージの送信を行うためのオブジェクト
・主なメソッド
MessageConsumer
メッセージの受信を行うためのオブジェクト
主なメソッド
- send()
- receive()
- receiveNoWait()
Message
BytesMessage/TextMessage/MapMessage/StreamMessage/
ObjectMessageの5タイプのメッセージの親クラス
33
JMSプログラムの流れ
JMSはJ2EE標準規格であるため、MQIとは処理手順が異なる
PtoP、Pub/Subで共通したインターフェースを使用(JMS1.1)
アプリケーションのクラスとメソッド
JMSアプリケーション
(JMSクライアント)
初期化処理
キュー・マネージャーに接続
ConnectionFactory
Destination
キュー・マネージャー
(JMSプロバイダー)
Connection
start()
キューをオープン
Session
createSender()
メイン・ロジック
メッセージの書き込み
メッセージの読み込み
MessageProducer
send()
MessageConsumer
receive()
終了処理
キューのクローズ
キュー・マネージャーと切断
ネームスペース
(ディレクトリ・サービス)
Session
close()
Connection
stop()
34
ConnectionFactory
JMSクライアント(JMSアプリケーション)がJMSプロバイダー(MQ)との接続に必要な情報
後続のクラスでJMSプロバイダーとのコネクションを生成する際に必要
ネーム・スペースにアクセスし、ConnectionFactoryオブジェクトを取得
InitialContextクラスのlookupメソッドを使用
アプリケーション内でConnectionFactoryオブジェクトを作成、設定することも可能
主に以下の情報をConnectionFactoryに設定
WAS管理コンソール、
JMS Adminコマンド
などで設定
接続先キュー・マネージャー名
CCSID
接続先キュー・マネージャーが稼動するホスト名、ポート番号 など
コーディング・イメージ
ネームスペース
(ディレクトリ・サービス)
lookup()
InitialContext ic = new InitialContext();
ConnectionFactory cf =
(ConnectionFactory)ic.lookup(”ConnectionFactory名”);
ConnectionFactory
35
Destination
メッセージの送信先/受信先のキューやトピックを表すクラス
後続の処理で、MessageProducer、MessageConsumerを生成する際に必要
ネーム・スペースにアクセスし、Destinationオブジェクトを取得
InitialContextクラスのlookupメソッドを使用
アプリケーション内でDestinationオブジェクトを作成、設定することも可能
WAS管理コンソール、
JMSアドミンコマンド
などで設定
lookup()
コーディング・イメージ
Destination dest =
(Destination)ic.lookup(”Destination名”);
36
ネームスペース
(ディレクトリ・サービス)
Destination
Connection/Session
Connection
JMSクライアントがJMSプロバイダーとの接続を管理するオブジェクト
ConnectionFactoryのcreateConnection()メソッドより取得
Sessionオブジェクトの生成に必要
start()メソッドから明示的に開始
close()メソッドで停止
Session
送信されるメッセージの順序、トランザクションを管理するオブジェクト
ConnectionのcreateSession()メソッドより取得
1つのコネクションから複数のSessionオブジェクトを生成することが可能
後続の処理で、MessageProducer、MessageConsumerを生成する際に必要
close()メソッドで停止
コーディング・イメージ
Connection con = (Connection)cf.createConnection();
con.start();
Session session =
con.createSession(false,Session.AUTO_ACKNOWLEDGE);
37
キュー・マネージャー
(JMSプロバイダー)
キュー・マネージャー
との接続
メッセージの順序、
トランザクションを管理
MessageProducer
メッセージの送信を行うためのオブジェクト
SessionオブジェクトのcreateProducer()メソッドより生成
close()メソッドで停止
コーディング・イメージ
MessageProducer prd = session.createProducer(dest);
メッセージの送信処理
Messageオブジェクトを、Sessionオブジェクトから生成
TextMessageなどのメッセージ・タイプごとメソッドが異なる
MessageProducerのsend()メソッドより、メッセージの送信を行う
TextMessageを送信する例
コーディング・イメージ
String msgContent = ”This is a TextMessage”;
TextMessage msg = session.createTextMessage( );
msg.setText( msgContent );
prd.send(msg);
38
キュー・マネージャー
(JMSプロバイダー)
MessageConsumer
メッセージの受信を行うオブジェクト
SessionオブジェクトのcreateConsumer()メソッドより生成
close()メソッドで停止
コーディング・イメージ
MessageConsumer mc = session.createConsumer(dest);
メッセージの受信処理
MessageConsumerオブジェクトのメソッドを使用
receive()メソッド:
GET_waitに相当するメソッド
receiveNoWait()メソッド: waitなしのGETに相当するメソッド
Messageオブジェクトが返される
コーディング・イメージ
キュー・マネージャー
(JMSプロバイダー)
long waitInteral = 3000; // 待ち時間(msec)
Message receivedMsg =
msgReceiver.receive(waitInterval);
String receivedContent =
((TextMessage) receivedMsg).getText();
39
JMSを用いたプログラミング手順のまとめ
パッケージのインポート
javax.jms.*
キュー・コネクション・ファクトリーの取得
ConnectionFactory
キューの取得
Destination
creatConnection()
キュー・コネクションの作成、スタート
Connection
start()
キュー・セッションの作成
createSession()
Session
送信の場合
キュー・センダーの作成
受信の場合
createProducer()
キュー・レシーバーの作成
createConsumer()
MessageProducer
MessageConsumer
createTextMessage()
メッセージの作成
TextMessage
メッセージの送信
send()
メッセージの取得
(同期点処理)
キュー・センダーのクローズ
receive()
commit()/rollback()
close()
キュー・レシーバーのクローズ
キュー・セッションのクローズ
close()
close()
キュー・コネクションのクローズ
40
close()
サンプル・コード(JMS)
import javax.jms.*;
import javax.naming.*;
・・・・・・・・・・・・・・ 1
public static void main(String[] args) {
try{
InitialContext ic = new InitialContext();
ConnectionFactory cf = (ConnectionFactory)context.lookup(“QcfName”);
Destination dest = (Destination)context.lookup(“QName”);
Connection connection = cf.QueueConnection();
connection.start();
・・・・・・・・・ 2
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 3
・・・ ・・・・・・・・・・・・・・・・・・・・・・・・ 4
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(dest);
TextMessage outMessage = session.createTextMessage();
outMessage.setText(“テキスト・メッセージ”);
producer.send(outMessage);
・・・・・・ 5
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 6
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 7
MessageConsumer consumer = session.createConsumer(dest);
Message inMessage = consumer.receive(10000);
String message = ((TextMssage)inMessage).getText();
producer.close();
consumer.close();
session.close();
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 8
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 9
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 10
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 11
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 12
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 13
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 14
connection.close();
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 15
}
catch(javax.jms.JMSException ex){
System.out.println(“JMSException occurred.” + ex);
}
}
41
サンプル・コード(JMS)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
パッケージのインポート:javax.jms.*
IBM提供クラスを使用する場合は、com.ibm.mq.*, com.ibm.mq.jms.* もインポートする
JNDIのcontext.lookupで、「QcfName」という名前のキュー・コネクション・ファクトリーを入手
JNDIのcontext.lookupで、「QName」というキュー宛先を入手
キュー・コネクションの作成と開始
: createQueueConnection
キュー・セッションの作成
: createQueueSession
同期点処理を行うかどうかを指定(サンプルでは「同期点なし」に設定)
キュー・センダーを作成
: createSender
テキスト・メッセージを作成
: createTextMessage
キュー・センダーの sendメソッドでメッセージを送信
キュー・レシーバーを作成
: createReceiver
キュー・レシーバーのreceiveメソッドでメッセージを受信
メッセージの待ち時間をミリ秒単位で指定
受信したメッセージをテキスト・メッセージとして処理
キュー・センダーのクローズ
キュー・レシーバーのクローズ
セッションのクローズ
コネクションのクローズ
42
主要なサンプル・プログラム(JMS)
MQ提供のサンプル・プログラム
ソースファイル
コンパイル済み
メッセージの書き込み
JmsProducer.java
JmsProducer.class
メッセージの読み取り
JmsConsumer.java
JmsConsumer.class
メッセージのブラウズ
JmsBrowser.java
msBrowser.class
配置ディレクトリー
UNIX系:
Windows:
/usr/mqm/samp/jms/samples
<導入ディレクトリ>¥Tools¥jms¥Samples
43
Fly UP