...

MQ Java インターフェース ISE Web & Transaction System 2003年7月

by user

on
Category: Documents
186

views

Report

Comments

Transcript

MQ Java インターフェース ISE Web & Transaction System 2003年7月
MQ Java インターフェース
ISE Web & Transaction System
2003年7月
<MQ Java インターフェース>
トピック
Web環境でのメッセージング利用
IBM WebSphere MQ のJavaインターフェース
MQ Base Java
JMS(Java Message Service)
MDB(Message Driven Bean)
EMS(Extended Message Service)
前提S/W
2
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
Web環境でのメッセージング利用
緩やかな連携
!
相手システムに影響されない
"
"
!
稼動時間帯、システム構成変更
プラットフォーム、開発言語
他企業との連携
既存システムとの連携
!
Non Java 環境のシステムとのデータ連携
!
レガシー・アプリケーションとの連携
パッケージ・アプリケーションとの連携
EJBコンテナ
EJB
JMS/Base/MDB
アプリケーション・サーバ
Webコンテナ
Webサーバ
!
アプリケーション・サーバ
MQメッセージング
Servlet
JMS/Base
既存のサーバ/ホスト
C/COBOL
MQアプリケーション
EJBコンテナ
EJB
JMS/Base/MDB
MQ GW パッケージ
アプリ
・ソフト
3
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
IBM WebSphere MQ のJava I/F
MQ Base Java
!
!
WebSphere MQ(WMQ)専用のメッセージング・インターフェース
MQI(Message Queuing Interface)そのままのイメージでコーディング可能
AMI(Application Messaging Interface)
!
!
OAG(Open Application Group)が標準化したメッセージング用のAPI
MQIより高度に抽象化されたAPI
"
"
"
!
MQIの各種パラメータを、外部ファイルにパラメータ・セットとして外出し
パラメータ・セットのファイルはGUIで設定することも可能
アプリケーションは、パラメータ・セットを使ってメッセージを送受信
C、C++、Java
JMS(Java Message Service)
!
!
!
J2EE標準のメッセージング・インターフェース
WMQにアクセス可能なクラスを提供
WMQ固有の機能を追加
4
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
IBM WebSphere MQ のJava I/F(続き)
Message Driven Bean
!
!
!
!
J2EE標準のインターフェース
EJB(メッセージ駆動型処理)
JMSの機能を使用して実装
WebSphere Application Server(WAS) V5からサポート
Extended Messaging Service
!
IBMが拡張した機能で、EJBにメッセージング機能を統合
"
"
!
!
送信側Bean(SenderBean) :メッセージ送信と応答受信
受信側Bean(ReceiverBean):メッセージ受信と応答送信
開発者から、メッセージング(JMS)の詳細な設定を隠蔽
WebSphere Application Server(WAS) Enterprise V5 でサポート
5
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
MQ Base Java
標準的なMQI機能のサポート
!
MQIがサポートする機能はすべて使用可能
"
!
同期点制御、メッセージID / 相関IDの利用、レポート・オプション、MQクラスターなど
データベース・コーディネーション機能
"
"
MQがコーディネータで、メッセージとDBの2フェーズコミットを行なう
グローバル・トランザクションには参加できない(= WASがコーディネータ)
MQローカル接続 / クライアント接続が可能
!
MQクライアントの導入は不要
他言語のMQIと同様なプログラミング手順、デザインが可能
!
オプションや構造体も同じイメージ
"
"
MQPMO/MQGMO : MQPutMessageOptions / MQGetMessageOptions
MQMD
: MQMessageオブジェクト
キュー・マネージャー
コネクション・プーリングのサポート
!
!
キュー・マネージャーとの接続をプール
アプリケーションでプログラミングが必要
メッセージ作成 / 取り出しのためのメソッドを提供
!
!
MQIクライアント接続
ローカル接続
アプリケーション
MQCONN
アプリケーション
MQCONN
readString, readLine, writeString, writeInt, etc..
宛先に合わせた、コード変換、フォーマット変換も可能
6
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
MQ Base Javaのプログラミング手順
プログラミングの流れ
パッケージのインポート
com.ibm.mq.*
(接続環境の設定)
MQEnvironment クラス(クライアント接続時のチャネル設定)
キュー・マネージャーに接続
MQQueueManager クラス
キューをOPEN
MQQueue クラス
メッセージ作成/
MQMD設定
メッセージ作成/
MQMD設定
MQMessage
MQPMO作成
MQPutMessageOptions
MQGMO作成
メッセージPUT
putメソッド
メッセージGET
(同期点処理)
MQQueueManagerクラスのcommit/backoutメソッド
キューをCLOSE
closeメソッド
キュー・マネージャーから切断
disconnectメソッド
7
MQMessage
MQGetMessageOptions
getメソッド
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
サンプル・コーディング(Base Java)
import com.ibm.mq.*;
・・・・・・・・・・・・・・・・・・・・・・・・・1
public static void main(String args[]){
try{
MQQueueManager qmgr = new MQQueueManager("QMgrName");
・・・・・・・・・・・・・・・・・・・・・・・・・ 2
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;
queues.put(putMessage, mqpmo);
・・・・・・・・・・・・・・・・・・・・・・・・・ 6
MQMessage getMessage = new MQMessage();
MQGetMessageOptions mqgmo = new MQGetMessageOptions();
queue.get(getMessage, mqgmo);
String strMessage = getMessage.readString(17);
System.out.println(strMessage);
queue.close();
qmgr.disconnect();
} catch(MQException ex) {
System.out.println("MQException occurred¥ncc:" +
ex.completionCode +
"¥nrc:" + ex.reasonCode);
} catch(java.io.IOException ex){
System.out.println("IOException occurred");
}
}
}
8
・・・・・・・・・・・・・・・・・・・・・・・・・ 7
・・・・・・・・・・・・・・・・・・・・・・・・・ 8
・・・・・・・・・・・・・・・・・・・・・・・・・ 9
・・・・・・・・・・・・・・・・・・・・・・・・・10
・・・・・・・・・・・・・・・・・・・・・・・・・11
・・・・・・・・・・・・・・・・・・・・・・・・・12
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
サンプル・コーディング
<ノート>
1.
パッケージ・ファイルのインポート : com.ibm.mq.*
2.
キュー・マネージャ・オブジェクトを作成し、「QMgrName」に接続
3.
キュー・オブジェクトを取得することで、「QueueName」のオープン
4.
MQMD作成、priority=5、CCSID=943(S-JIS)に指定してメッセージ・オブジェクトを作成
5.
MQPMO作成、同期点処理無しに設定
6.
メッセージPUT
7.
MQMDをデフォルトの設定でメッセージ・オブジェクトを作成
8.
MQGMOをデフォルトの設定で作成
9.
同一のキューからメッセージGET
10. メッセージ・オブジェクトからメッセージを取得
11. キューをクローズ
12. キュー・マネージャから切断
9
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
JMS(Java Message Service)
Java環境での標準メッセージング・インターフェース
!
サン・マイクロシステムズ㈱が中心となって標準化された仕様
"
"
!
Java Message Service Documentation V1.0.2
http://java.sun.com/products/jms/docs.html
製品に依存しないアプリケーション構築が可能#アプリケーション・ポータビリティ
JMSクライアント(Client)
!
JMSインターフェースを使用して、メッセージ・サービスを使用するアプリケーション
JMSプロバイダー(Provider)
!
JMSを実装したクラスを提供するメッセージング製品
JMSプロバイダー
プロバイダー
WMQ
JMSクライアント
クライアント
JMS
他社メッセー
ジング製品
JMSクライアント
クライアント
JMS
他社メッセー
ジング製品
メッセージング・
メッセージング・サービス
10
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
JMS(Java Message Service)
ドメイン(Domains)
!
Point to point(PTP)
"
!
“キュー宛先”に対してメッセージを送受信するモデル
Publish/Subscribe(Pub/Sub)
"
“トピック宛先“に対してメッセージを送受信するモデル
Publish/Subscribe(Pub/Sub)モデル
Publish/Subscribe(Pub/Sub)モデル
JMS
クライアント
Point to point(PTP)モデル
point(PTP)モデル
JMS
クライアント
Receive
トピックA
JMS
クライアント
キュー
JMS
クライアント
ブローカー
Receive
Send
Publish
JMS
クライアント
Send
トピックB
Subscribe
JMS
クライアント
JMS
クライアント
11
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
MQ JMS
IBMで提供するJMSプロバイダーは、WebSphere MQ(WMQ)
!
WMQにアクセス可能な、JMSインターフェースを実装したJavaクラスを提供
PTP と Pub/Sub モデルをサポート
MQローカル接続 / クライアント接続が可能
!
MQクライアントの導入は不要
WAS V5で扱えるJMSプロバイダー
!
!
一般 JMSプロバイダー
WebSphere JMSプロバイダー
"
"
!
:他社製品
:WAS V5での組み込みメッセージング・サポート
WASにWMQサーバーを統合
MQチャネル接続はできない
WebSphere JMS MQプロバイダー :WMQ
JMS特有の主な機能をサポート
!
非同期メッセージ受信(MessageListener)
"
!
メッセージ・セレクター
"
!
別スレッドでメッセージ受信を行なう
メッセージにセットされたキーワード(セレクター)で特定のメッセージを選択受信できる
マップ・メッセージ
"
要素名:値のペアで構成されるXMLメッセージで、ユーザ指定の要素名で値を取り出せる
12
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
MQ JMS(続き)
MQIがサポートする機能はほぼ使用可能
!
同期点制御、メッセージID / 相関IDの利用、レポート・オプションなど
!
プロバイダ固有のクラス、インターフェースを提供
"
アプリケーションのポータビリティは、損なわれる
JMSに準拠したプログラミング手順、デザインが必要
!
WMQのMQIと同様なプログラミング手順、デザインはできない
!
使用できない機能、指定できないオプションがある
"
メッセージIDのユーザ設定、セグメンテーション機能、データベース・コーディネーション機能、
キューの属性照会(MQINQ)、BROWSEでのメッセージ待ち受け など
グローバル・トランザクションに参加可能
!
!
!
WASがコーディネータで、MQがリソース・マネージャーとして2フェーズコミットに参加
MQ拡張トランザクショナル・クライアント機能:クライアント接続でも可能
MQデータベース・コーディネーションはできない(MQはコーディネータになれない)
コネクション・プーリングのサポート
!
デフォルトで、キュー・マネージャーとの接続をプール
"
!
使われていないコネクションを10個、5分間プール
コネクション数などはプログラミングで変更可能
"
MQ Base Javaクラスを利用
13
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
JMSメッセージとMQメッセージ
JMSクライアントが扱うメッセージは、MQメッセージにマップおよびコピーされる
JMSアプリケーション
JMSメッセージ
ヘッダー
プロパティ
データ
!
マップ
コピー
MQMD
RFH2
データ
マップ
JMSアプリケーション
コピー
JMSメッセージ
ヘッダー
プロパティ
データ
MQメッセージ(MQMD)にないJMSメッセージの属性は、MQRFH2ヘッダーに付加
"
例) JMSヘッダ
JMSDestination
JMSMessageID
JMSCorrelationID
!
MQメッセージ
MQMD
-
MsgId
CorrelId
MQRFH2
Dst
-
Cid
MQRFH2ヘッダーを付加せずにメッセージ送信することも可能(次のいずれかの方法)
"
"
"
管理ツールより管理オブジェクトQueueのTARGCLIENT値を“MQ”と設定
WAS管理コンソールより、キュー宛先のターゲット・クライアントを“MQ”と設定
アプリケーションでDestinationオブジェクトのTargetClient値を
"JMSC.MQJMS_CLIENT_NOJMS_MQ“ と設定する
JMSアプリケーション
JMSメッセージ
ヘッダー
プロパティ
データ
マップ
MQメッセージ
MQMD
データ
MQアプリケーション
MQメッセージ
MQMD
データ
コピー
14
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
JMS管理オブジェクト
JMSプロバイダーに接続するための情報を持つ、Javaオブジェクト
!
!
各社メッセージング製品に関する情報を、JMSクライアントから切り離し、アプリケーショ
ンのポータビリティーを高めることを目的
JNDIネーム・スペースに格納される
"
!
ファイル、LDAP、WASネーミング・サービス
JMSクライアントは実行時にネーム・スペースにアクセスし、オブジェクトを取得
JMS管理オブジェクト
!
コネクション・ファクトリー(接続ファクトリー)
"
!
QueueConnectionFactory / TopicConnectionFactory
キュー・マネージャー名、接続タイプ、 ホスト名、チャネル名、ポート番号 など
宛先(Destination)
"
Queue / Topic : キュー名、トピック名 など
プロバイダーが用意する管理ツールで
登録および属性の設定、変更
!
!
JNDIネームスペース
コネクション・ファクトリー
QMgr名
JMSAdminコマンド(MQが提供)
WAS V5 管理コンソール
取得
JMS
クライアント
15
宛先
キュー名/トピック名
登録
JMSAdmin
WAS管理コンソール
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
JMSのプログラミング手順
プログラミングの流れ(PTPの場合)
javax.jms*
パッケージのインポート
キュー・コネクション・ファクトリーの取得
ConnectionFactory
QueueConnectionFactory
キュー・コネクションの作成、スタート
Connection
QueueConnection
キュー・セッションの作成
キューの取得
キュー・センダーの作成
メッセージの作成
メッセージ送信
Session
QueueSession
Destination
Queue
MessageProducer
QueueSender
Message
TextMessage…..
キュー・レシーバーの作成
MessageConsumer
QueueReceiver
メッセージの取得
QueueReceiverの
receiveメソッド
メッセージ・タイプの確認
QueueSenderの
sendメソッド
Message
TextMessage…..
(同期点処理)
QueueSession のcommit/backout メソッド
クローズ
QueueSender,QueueReceiver,QueueSession,QueueConnection をclose゙
16
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
サンプル・コーディング(JMS)
import javax.jms.*;
・・・・・・・・・・・・・・ 1
import javax.naming.*;
import javax.naming.directory.*;
public static void main(String[] args) {
try{
QueueConnectionFactory qcf = (QueueConnectionFactory)context.lookup(qcfname);
・・・・・・・・・・・ 2
QueueConnection qc = qcf.createQueueConnection();
・・・・・・・・・・・・・・・ 3
qc.start();
QueueSession session = qc.createQueueSession(Transacted,AcknowlegeMode); ・・・・・・・・・・・・・・・ 4
Queue queue = (Queue)context.lookup(qname);
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 5
QueueSender sender = session.createSender(queue);
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 6
TextMessage outMessage = session.createTextMessage();
outMessage.setText(“テキスト・メッセージ”);
sender.send(outMessage);
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 7
QueueReceiver receiver = session.createReceiver(queue);
Message inMessage = receiver.receive(WaitInterval);
String message = ((TextMssage)inMessage).getText();
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 9
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 10
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 11
sender.close();
receiver.close();
session.close();
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 12
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 13
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 8
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 14
qc.close();
・・・・・・・・・・・・・・・・・・・・・・・・・・・ 15
}
catch(javax.jms.JMSException ex){
System.out.println(“JMSException occurred.” + ex);
}
}
17
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
サンプル・コーディング
<ノート>
1.
パッケージのインポート:javax.jms.*
IBM提供クラスを使用する場合は、com.ibm.mq.*, com.ibm.mq.jms.* もインポートする
2.
JNDIのcontext.lookupで、「qcfname」という名前のキュー・コネクション・ファクトリーを入手
3.
キュー・コネクションの作成と開始
4.
キュー・セッションの作成
: createQueueSession
同期点処理を行うかどうかを指定
5.
JNDIにて、「qname」というキュー宛先を入手
6.
キュー・センダーを作成
: createSender
7.
テキスト・メッセージを作成
: createTextMessage
8.
キュー・センダーの sendメソッドでメッセージを送信
: createQueueConnection
キュー・レシーバーを作成
: createReceiver
メッセージの待ち時間をミリ秒単位で指定
10. キュー・レシーバーのreceiveメソッドでメッセージを受信
9.
11. 受信したメッセージをテキスト・メッセージとして処理
12. キュー・センダーのクローズ
13. キュー・レシーバーのクローズ
14. セッションのクローズ
15. コネクションのクローズ
18
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
Message Driven Bean(MDB)
EJB2.0で決められた新しいタイプのEJB
!
!
非同期実行メカニズムを実現
メッセージ到着時に、コンテナーによって呼び出されるEJB
"
"
EJBクライアントから呼び出すことはできない
Homeインターフェース、リモート・インターフェースがない
JMS宛先(キュー/トピック)にメッセージが到着すると、EJBコンテナが
onMessage() を起動
!
1メッセージで1インスタンスのみ起動される
"
!
!
並列にメッセージ受信およびビジネスロジックの実行が可能
ビジネスロジックは、onMessage() に記述
"
!
MQのトリガー機能に類似、トリガー・モニターはEJBコンテナ
受信メッセージは、Message オブジェクトとして参照可能
メッセージ・セレクターの設定も可能
メッセージ送信
JMSクライアント
Destination
MQアプリケーション
作成/検索
EJBHome
EJBクライアント
EJBObject
メソッド呼び出し
19
EJBコンテナ
メッセージ・オブジェクト
MDB
MDB
Session
Entity
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
MDB(続き)
コンテナが起動時にインスタンスを作成し、コネクション、セッションのプールが可能
!
WAS管理コンソールから調整可能
トランザクション機能のサポート
!
グローバル・トランザクションを自動的に開始させることが可能
"
"
"
"
!
コンテナ管理トランザクションとして設定(CMT)
メッセージ受信とビジネスロジック内のリソース更新(DB、メッセージ送信)とを1UOWとして処理
できる
Required を設定
NotSupportedの場合は、トランザクションは引き継がれない
ディプロイメント・ディスクリプタにトランザクション定義を行なう
【BMTのUOW】
【CMT(Required)設定時のUOW】
メッセージ受信
コンテナがトランザクションを開始
メッセージ受信
:
DB更新
:
メッセージ送信
MDB
トランザクション開始
:
DB更新
:
メッセージ送信
コミット/ロールバック
MDB
コンテナがトランザクションをコミット/ロールバック
20
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
MDBの設定
JMSリスナーポートの設定
!
MDB起動のためにメッセージを待ちうける論理的な宛先(キュー名)を設定
"
"
コネクション・ファクトリー JNDI名
宛先(キュー/ トピック) JNDI名
MDB稼働条件は、ディプロイメント・ディスクリプターに設定
!
1.
2.
3.
WSADで定義可能
リスナー・ポートの指定
メッセージ・セレクターの設定
トランザクション設定
アプリケーション・サーバ
JNDIネームスペース
EJBココンテナ
キュー・マネージャー
コネクション・ファクトリー
キュー1
リスナー・サービス
リスナー・
ポート 1
MDB1
MDB1
宛先(キュー)
宛先(キュー)
リスナー・
ポート2
MDB2
MDB2
キュー2
21
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
MDBの設定とプログラミング手順
設定とプログラミングの流れ
!
!
JMS管理オブジェクトとリスナー・ポートはWAS管理コンソールから定義可能
MDBは、WSADで作成支援が可能
コーディング
コーディング
設定
設定
キュー・コネクション・ファクトリーの定義
パッケージのインポート
キュー宛先の定義
MessageDrivenBeanインタフェース
MessageListenerインタフェースの実装
implements javax.ejb.MessageDrivenBean,
javax.jms.MessageListener
リスナー・ポートの定義
各メソッドの作成
ビジネスロジックの作成
javax.jms*
ejbCreate()
ejbRemove()
setMessageDrivenContext()
onMessage()
MDBとリスナー・ポートの紐付け
MDBのデプロイ
22
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
キュー・コネクション・ファクトリーの作成
WebSphere JMS MQ Provider 使用時の例
!
!
WAS管理コンソールのナビゲーション・ペインから「リソース」→「WebSphere JMS MQ Provider」を選択
追加プロパティーから「WebSphere MQ キュー接続ファクトリー」を選択し、作成
23
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
キュー・コネクション・ファクトリーの作成(続き)
JNDI名を指定
キュー・コネクション・ファクトリーの名前を指定
WebSphere 管理ドメインにある JMS 接続ファクトリー内で固有で
なければいけない
キュー・マネージャ名を指定
WebSphere MQ JMS プロバイダーの
場合、実際のキュー・マネージャーは、別
途MQコマンドで作成しておく
WebSphere JMS プロバイダーの場合
は、導入時、自動的に作成される
24
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
キュー宛先の作成
!
!
ナビゲーション・ペインから「リソース」→「WebSphere JMS MQ Provider」を選択
追加プロパティーから「WebSphere MQ キュー宛先」を選択し、作成
25
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
キュー宛先の作成(続き)
キュー宛先の名前を指定
JNDI名を指定
WebSphere MQ JMS プロバイダー
の場合、実際のキューはWAS管理コ
ンソールから作成できないので、別途
MQコマンドで作成する
WebSphere JMS プロバイダーの場合
は、JMSサーバ構成画面からキュー名
を指定するとキューが作成できる
キュー名を指定
26
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
リスナー・ポートの作成
!
!
ナビゲーション・ペインから「サーバー」→「アプリケーション・サーバー」を選択し、コンテンツ・ペインで、アプ
リケーション・サーバーの名前を選択
「追加プロパティー」から「メッセージ・リスナー・サービス」→「リスナー・ポート」を選択
27
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
リスナー・ポートの作成(続き)
リスナー・ポートの名前を指定
リスナー・ポートによって使用される
キュー・コネクション・ファクトリーの
JNDI名を指定
リスナー・ポートによって使用される
キュー宛先のJNDI名を指定
28
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
MDBとリスナー・ポートの紐付け
MDBとリスナー・ポートの紐付けは、WSADにて設定
!
!
WSADの「J2EE 階層」より、対象のEJBの「EJB デプロイメント・ディスクリプター」を表示
「Bean」タブを選択し、リスナー・ポートを指定
リスナー・ポートを指定
29
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
サンプル・コーディング(MDB)
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 1
import javax.jms.*;
import javax.naming.*;
import javax.naming.directory.*;
public class SampleBean
implements javax.ejb.MessageDrivenBean, javax.jms.MessageListener {
private javax.ejb.MessageDrivenContext fMessageDrivenCtx;
・・・・・・・・・・・・・・・ 2
public javax.ejb.MessageDrivenContext getMessageDrivenContext() {
return fMessageDrivenCtx;
}
public void setMessageDrivenContext(javax.ejb.MessageDrivenContext ctx) {
fMessageDrivenCtx = ctx;
}
・・・・・・・・・・・・・・・ 3
public void ejbCreate() {
}
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 3
public void onMessage(javax.jms.Message msg) {
:
:
}
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 4
public void ejbRemove() {
}
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 3
}
30
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
サンプル・コーディング
<ノート>
1.
パッケージのインポート :javax.jms.*
2.
MDBはMessageDrivenBeanインタフェースとMessageListenerインタフェースを実装する
3.
MessageDrivenBeanインタフェースは以下の3つのメソッドを定義する
public interface MessageDrivenBean{
public void ejbCreate();
public void ejbRemove();
public void setMessageDrivenContext(MessageDrivenContext mdc);
}
4.
MessageListenerインタフェースは次のようにonMessage()メソッドを定義する
ここにユーザ・ロジックを書く
public interface MessageListener{
public void onMessage();
}
※WSADを使用してMDBを作成する場合、上記インタフェースやメソッドは自動的に生成される
31
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
onMessage()メソッド サンプル・コーディング
public void onMessage(javax.jms.Message msg) {
try{
TextMessage textMsg = (TextMessage)msg;
String text = textMsg.getText();
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 1
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 2
QueueConnectionFactory qcf = (QueueConnectionFactory)context.lookup(qcfname); ・・・・・・・ 3
QueueConnection qc = qcf.createQueueConnection();
・・・・・・・・・・・・・・・・・・・・・・・・・・・・4
qc.start();
QueueSession session = qc.createQueueSession(Transacted,AcknowlegeMode); ・・・・・・・・・・ 5
Queue queue = (Queue)context.lookup(qname);
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 6
QueueSender sender = session.createSender(queue);
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 7
TextMessage outMessage = session.createTextMessage();
outMessage.setText(text);
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 8
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 9
sender.send(outMessage);
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 10
sender.close();
session.close();
qc.close();
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 11
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 12
・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 13
}
catch(JMSException ex){
System.out.println("JMSException occur." + ex);
}
}
32
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
onMessage()メソッド サンプル・コーディング
1.
引数としてjavax.jms.Messageを受信
受信メッセージは、メッセージ・オブジェクトとして渡される
2.
メッセージをテキスト・メッセージに変換して変数に格納
3.
JNDIのcontext.lookupでキュー・コネクション・ファクトリーを入手
4.
キュー・コネクションの作成と開始
5.
キュー・セッションの作成
: createQueueSession
同期点処理を行うかどうかを指定
6.
JNDIで宛先キューを入手
7.
キュー・センダーを作成
: createQueueSender
8.
テキスト・メッセージを作成
: createTextMessage
9.
送信用のテキスト・メッセージに受信したメッセージをセット
<ノート>
: createQueueConnection
メッセージ送信のための処理
10. キュー・センダーのsendメソッドでメッセージを送信
11. キュー・センダーのクローズ
12. セッションのクローズ
13. コネクションのクローズ
33
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
Extended Messaging Service(EMS)
IBM独自の機能
!
WAS Enterprise V5での新機能
"
!
将来J2EE仕様になるか??
WSAD IE V5で専用のウィザードを使って開発
メッセージ送受信の機能をサーバサイドのコンポーネントとして提供
!
送信側Bean(SenderBean)
"
"
"
"
!
Stateless Session Bean
メッセージの送信、応答の受信を行なう
応答の待ち方が選択できる(同期応答、据え置き応答、応答なし)
応答を待つタイムアウト値の設定も可能
受信側Bean(ReceiverBean)
"
"
"
Stateless Session Bean または、MDB
メッセージの受信、応答の送信を行なう
応答の送信方法が選択できる(同期応答、非同期応答、応答なし)
Bean開発者にわかりやすいプログラミング・モデル
!
入力ポート / 出力ポート / リスナーポートに対してメッセージを送受信
"
!
JMS管理オブジェクト(キュー・コネクション・ファクトリー、宛先など)を意識する必要はない
送信/受信データは、JMSメッセージ・オブジェクトまたは引数として扱える
34
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
Extended Messaging Service(EMS)
メッセージとJavaオブジェクト間のデータマッピング機能を提供
!
メソッド引数とJMSメッセージの変換を行なう
"
アプリケーションは、JMSメッセージ構造を知らなくても良い
トランザクション機能
!
受信側Beanの受信メッセージと送信メッセージを1UOWにすることが可能
"
コンテナ管理トランザクション(CMT)
35
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
EMSによるメッセージング・シナリオの例
送信側:同期応答受信あり + 受信側:MDB、同期応答送信あり の組み合わせ
! 送信側Bean(SenderBean)
"
"
"
!
アプリケーションEJBが送信側Beanをコールし、データを渡す
送信側Beanがメッセージを送信し、応答を受信する
応答がアプリケーションEJBに戻される
受信側Bean(ReceiverBean)
"
"
"
JMSメッセージが到着するとMDBとして作成された受信側Beanが起動される
受信側BeanはユーザのビジネスロジックEJBをコールし、リターンを待つ
受信側BeanはアプリケーションEJBの戻り値から応答メッセージを作成し、オリジナル・メッセージに
設定されている宛先に送信する
JNDIネームスペース
コネクション・ファクトリー
宛先(キュー)
宛先(キュー)
【送信側Bean 同期応答受信あり】
EJBコンテナ
sendWithResponse(...)
ビジネス
Sender
ロジック
Bean
EJB
リターン
キュー・マネージャー
出力
ポート
【受信側Bean(MDB)、同期応答送信あり】
EJBコンテナ
リスナー
ポート
onMessage(...)
Receiver
Bean
(MDB)
method(...)
ビジネス
ロジック
EJB
リターン
MQメッセージ
36
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
EMSによるメッセージング・シナリオの例
送信側:非同期応答受信あり + 受信側:アプリケーション呼び出し可能受信側
Bean、応答送信あり の組み合わせ
!
送信側Bean(SenderBean)
"
"
"
!
EJBアプリケーションが送信側Beanの送信要求メソッドをコールし、データを渡す
送信側Beanがメッセージを送信し、Correlatorを戻す
EJBアプリケーションはCorrelatorを引数に、送信側Beanの応答要求メソッドをコールする
受信側Bean(ReceiverBean)
"
"
"
EJBアプリケーションが受信側Beanの受信要求メソッドをコールする
受信側Beanは、宛先をpollし、メッセージが到着したらアプリケーションEJBにデータを戻す
EJBアプリケーションは、受信側Beanの応答送信要求メソッドをコールし、受信側Beanが応答メッ
セージを送信する
JNDIネームスペース
コネクション・ファクトリー
宛先(キュー)
宛先(キュー)
【送信側Bean 非同期応答受信あり】
EJBコンテナ
sendDeferredResponse(...)
ビジネス
Sender
ロジック
Bean
EJB
【アプリケーション呼び出し可能受信側Bean
非同期応答送信あり】
EJBコンテナ
キュー・マネージャー
出力
ポート
receive(...)
入力
ポート
receiveResponse(...)
ビジネス
Application
ロジック
Callable
EJB
Receiver
Bean
sendReply(...)
MQメッセージ
37
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
送信側Beanの開発
出力ポートの指定
メソッド名は自由に
設定
応答情報の
指定
データ・マッピング機能
の利用の有無を指定
メッセージ・フォーマットを識別するためのID
JMSTypeにマッピングされる
38
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
受信側Beanの開発
MDB内部からコールされるアプリ
ケーションEJBのメソッドの指定
応答情報の
指定
データマッピング機能の利
用の有無を指定
メッセージ・フォーマットを識別するためのID
JMSTypeにマッピングされる
39
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
生成コード(送信側Bean・同期応答、データマッピングあり)
import com.ibm.websphere.ems.CMMException;
import com.ibm.ws.spi.ems.transport.CMMSender;
import com.ibm.ws.spi.ems.CMMFactory;
import com.ibm.ws.spi.ems.format.cmm.CMMFormatter;
import com.ibm.ws.spi.ems.transport.MessageFactory;
import com.ibm.ws.spi.ems.format.cmm.CMMParser;
...
public float sendWithResponse(long timeout, int p0) throws CMMException, javax.ejb.FinderException
{
// 送信側の作成
CMMSender sender = CMMFactory.createSender("MyBank/oPort");
try {
// メッセージ・ファクトリーの作成
MessageFactory factory = sender.getMessageFactory();
// フォーマッターの作成
CMMFormatter formatter = CMMFactory.createCMMFormatter(factory);
// メッセージへのパラメーターの追加
formatter.addIntParameter(p0);
// メッセージの取得
Object request = formatter.getMessage();
// メッセージ型の設定
sender.setRequestMessageType("EMSFormat_10");
// 送信要求受信応答
Object response = sender.sendRequestReceiveResponse(request, timeout);
// パーサーの作成
CMMParser parser = CMMFactory.createCMMParser(response);
// 処理例外
if (parser.containsException()){
(例外処理)
}
// 応答を抽出して戻る
return parser.getFloatParameter();
}
40
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
生成コード(受信側Bean(MDB)、同期応答送信あり)
import com.ibm.ws.spi.ems.CMMFactory;
import com.ibm.websphere.ems.CMMException;
import javax.jms.JMSException;
import com.ibm.ws.spi.ems.format.cmm.CMMParser;
import com.ibm.ws.spi.ems.transport.CMMReplySender;
import com.ibm.ws.spi.ems.transport.MessageFactory;
import com.ibm.ws.spi.ems.format.cmm.CMMFormatter;
...
public void onMessage(javax.jms.Message msg) {
//
メッセージ型に基づいて選択
if ("EMSFormat_3".equals(msg.getJMSType())){
try { // 応答送信側の作成
CMMReplySender replySender = CMMFactory.createReplySender(msg);
MessageFactory factory = replySender.getMessageFactory();
// フォーマッターの作成
CMMFormatter formatter = CMMFactory.createCMMFormatter(factory);
try {
// メッセージからパラメーターを抽出するためのパーサーの作成
CMMParser parser = CMMFactory.createCMMParser(msg);
// パラメーターの抽出
int param0 = parser.getIntParameter();
// EJB の作成
javax.naming.Context initialContext = new javax.naming.InitialContext();
com.ibm.mybank.ejb.TransferLocalHome home =
(com.ibm.mybank.ejb.TransferLocalHome)initialContext.lookup("java:comp/env/ejb/Transfer");
com.ibm.mybank.ejb.TransferLocal obj = home.create();
// ターゲット・メソッドの呼び出し
float reply = obj.getBalance(param0);
// 応答の設定
formatter.addFloatParameter(reply);
} catch(Exception exc) {
// 例外の設定
formatter.setException(exc);
}
Object reply = formatter.getMessage();
// 送信応答
replySender.sendReply(reply);
Copyright ISE Co,.Ltd.
41
return;
・・・
<MQ Java インターフェース>
生成コード
(アプリケーション呼び出し可能受信側Bean、受信要求)
import com.ibm.websphere.ems.CMMException;
import com.ibm.ws.spi.ems.transport.CMMReceiver;
import com.ibm.ws.spi.ems.CMMFactory;
import com.ibm.ws.spi.ems.format.cmm.CMMParser;
import com.ibm.websphere.ems.CMMReplyCorrelator;
import com.ibm.ws.spi.ems.transport.MessageFactory;
import com.ibm.ws.spi.ems.format.cmm.CMMFormatter;
import com.ibm.mybank.ejb.EMSFormat;
...
/**
* 生成完了 - タイムアウトありおよび JMS メッセージからのマップを受信
*/
public EMSMyFormat receive(long timeout) throws CMMException
{
// 受信側の作成
CMMReceiver receiver = CMMFactory.createReceiver("MyBank/iPort");
try {
// メッセージ型の設定
receiver.setRequestMessageType("TestFormat_6");
// メッセージの受信
Object request = receiver.receiveRequest(timeout);
// 相関関係子の取得
CMMReplyCorrelator corr = receiver.getCorrelator(request);
// パーサーの作成
CMMParser parser = CMMFactory.createCMMParser(request);
// 論理メッセージ・フォーマットの作成
return new EMSMyFormat(parser, corr);
}
finally
{
receiver.close();
}
}
42
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
生成コード
(アプリケーション呼び出し可能受信側Bean、応答送信要求)
/**
* 生成完了 - JMS メッセージにマップし、応答を送信
*/
public void sendReply(CMMReplyCorrelator corr, float p0) throws CMMException
{
// 受信側の作成
CMMReceiver receiver = CMMFactory.createReceiver("MyBank/iPort");
try {
MessageFactory factory = receiver.getMessageFactory();
// 応答フォーマッターの作成
CMMFormatter formatter = CMMFactory.createCMMFormatter(factory);
// 応答パラメーターの追加
formatter.addFloatParameter(p0);
Object request = formatter.getMessage();
// 送信応答
receiver.sendReply(corr, request);
}
finally
{
receiver.close();
}
}
43
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
ポートの作成
44
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
出力ポートの作成
45
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
入力ポートの作成
46
Copyright ISE Co,.Ltd.
<MQ Java インターフェース>
前提S/W
主な前提ソフトウェア
JDK
AMI
MQ Base Java
JMS
MDB
EMS
MQ
WMQ
V1.3
V5.2
V5.3
V1.3.1 V5.2
V5.3
V1.3.1 V5.2
V5.3
V1.3.1 V5.3
V1.3.1 V5.3
WAS
備考
N/A
サポートパックMA0F
必須ではない
サポートパックMA88
WMQ V5.3製品CDに付属
サポートパックMA88
WMQ V5.3製品CDに付属
WAS V5製品に付属
WAS V5が提供
WASV5 Enterprise が提供
必須ではない
V5
V5 Enterprise
注) AMIはサポートパックで提供
http://www-3.ibm.com/software/integration/support/supportpacs/individual/ma0f.html
MQV5.2用のBase JavaおよびJMSは、サポートパックMA88で次のURLから提供
http://www-3.ibm.com/software/integration/support/supportpacs/individual/ma88.html
MQV5.2およびサポートパックMA88は、2003/12末でサービス終了
前提S/Wのバージョンは、プラットフォームによって若干異なる
47
Copyright ISE Co,.Ltd.
Fly UP