MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/......
Transcript of MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/......
MQ Java MQ Java インターフェースインターフェース
ISE Web & Transaction System
2003年7月
Copyright ISE Co,.Ltd.2
<MQ Java インターフェース>
トピック
Web環境でのメッセージング利用IBM WebSphereMQ のJavaインターフェースMQ Base JavaJMS(Java Message Service)MDB(Message Driven Bean)EMS(Extended Message Service)前提S/W
Copyright ISE Co,.Ltd.3
<MQ Java インターフェース>
Web環境でのメッセージング利用
緩やかな連携
! 相手システムに影響されない
" 稼動時間帯、システム構成変更
" プラットフォーム、開発言語
! 他企業との連携
既存システムとの連携
! Non Java 環境のシステムとのデータ連携! レガシー・アプリケーションとの連携
! パッケージ・アプリケーションとの連携
アプリケーション・サーバ
Webコンテナ
ServletJMS/Base
EJBコンテナEJB
JMS/Base/MDB
MQメッセージング
EJBコンテナEJB
JMS/Base/MDB
アプリケーション・サーバ
既存のサーバ/ホスト
C/COBOLMQアプリケーション
パッケージ・ソフト
MQ GWアプリ
Webサーバ
Copyright ISE Co,.Ltd.4
<MQ Java インターフェース>
IBM WebSphere MQ のJava I/FMQ 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固有の機能を追加
Copyright ISE Co,.Ltd.5
<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 でサポート
Copyright ISE Co,.Ltd.6
<MQ Java インターフェース>
MQ Base Java
標準的なMQI機能のサポート! MQIがサポートする機能はすべて使用可能
" 同期点制御、メッセージID / 相関IDの利用、レポート・オプション、MQクラスターなど! データベース・コーディネーション機能
" MQがコーディネータで、メッセージとDBの2フェーズコミットを行なう" グローバル・トランザクションには参加できない(= WASがコーディネータ)
MQローカル接続 / クライアント接続が可能! MQクライアントの導入は不要
他言語のMQIと同様なプログラミング手順、デザインが可能! オプションや構造体も同じイメージ
" MQPMO/MQGMO : MQPutMessageOptions / MQGetMessageOptions" MQMD : MQMessageオブジェクト
コネクション・プーリングのサポート! キュー・マネージャーとの接続をプール
! アプリケーションでプログラミングが必要
メッセージ作成 / 取り出しのためのメソッドを提供! readString, readLine, writeString, writeInt, etc..! 宛先に合わせた、コード変換、フォーマット変換も可能
キュー・マネージャー
アプリケーションMQCONN
MQIクライアント接続
アプリケーションMQCONN
ローカル接続
Copyright ISE Co,.Ltd.7
<MQ Java インターフェース>
MQ Base Javaのプログラミング手順
プログラミングの流れ
パッケージのインポート
(接続環境の設定)
キュー・マネージャーに接続
キューをOPEN
メッセージ作成/MQMD設定
MQPMO作成
メッセージPUT
(同期点処理)
キュー・マネージャーから切断
メッセージGET
com.ibm.mq.*
MQEnvironment クラス(クライアント接続時のチャネル設定)
MQQueueManager クラス
MQQueue クラス
MQMessage
MQPutMessageOptions
putメソッド
closeメソッド
MQQueueManagerクラスのcommit/backoutメソッド
disconnectメソッド
getメソッド
MQGetMessageOptions
MQMessageメッセージ作成/MQMD設定
MQGMO作成
キューをCLOSE
Copyright ISE Co,.Ltd.8
<MQ Java インターフェース>
サンプル・コーディング(Base Java)import com.ibm.mq.*; ・・・・・・・・・・・・・・・・・・・・・・・・・1public static void main(String args[]){
try{MQQueueManager qmgr = new MQQueueManager("QMgrName"); ・・・・・・・・・・・・・・・・・・・・・・・・・ 2int openOption = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;MQQueue queue = qmgr.accessQueue("QueueName", openOption); ・・・・・・・・・・・・・・・・・・・・・・・・・ 3MQMessage putMessage = new MQMessage();
putMessage.priority = 5; ・・・・・・・・・・・・・・・・・・・・・・・・・ 4putMessage.characterSet = 943;putMessage.writeString("This is a message");
MQPutMessageOptions mqpmo = new MQPutMessageOptions(); ・・・・・・・・・・・・・・・・・・・・・・・・・ 5mqpmo.options = MQC.MQPMO_NO_SYNCPOINT;
queues.put(putMessage, mqpmo); ・・・・・・・・・・・・・・・・・・・・・・・・・ 6
MQMessage getMessage = new MQMessage(); ・・・・・・・・・・・・・・・・・・・・・・・・・ 7MQGetMessageOptions mqgmo = new MQGetMessageOptions(); ・・・・・・・・・・・・・・・・・・・・・・・・・ 8 queue.get(getMessage, mqgmo); ・・・・・・・・・・・・・・・・・・・・・・・・・ 9String strMessage = getMessage.readString(17); ・・・・・・・・・・・・・・・・・・・・・・・・・10System.out.println(strMessage);queue.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・11qmgr.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");}
}}
Copyright ISE Co,.Ltd.9
<MQ Java インターフェース>
サンプル・コーディング
1. パッケージ・ファイルのインポート : com.ibm.mq.*2. キュー・マネージャ・オブジェクトを作成し、「QMgrName」に接続3. キュー・オブジェクトを取得することで、「QueueName」のオープン4. MQMD作成、priority=5、CCSID=943(S-JIS)に指定してメッセージ・オブジェクトを作成5. MQPMO作成、同期点処理無しに設定6. メッセージPUT7. MQMDをデフォルトの設定でメッセージ・オブジェクトを作成8. MQGMOをデフォルトの設定で作成9. 同一のキューからメッセージGET
10. メッセージ・オブジェクトからメッセージを取得
11. キューをクローズ
12. キュー・マネージャから切断
<ノート>
Copyright ISE Co,.Ltd.10
<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プロバイダープロバイダープロバイダープロバイダー
WMQJMSクライアントクライアントクライアントクライアント
メッセージングメッセージングメッセージングメッセージング・・・・サービスサービスサービスサービス
他社メッセージング製品
他社メッセージング製品
JMS JMS
JMSクライアントクライアントクライアントクライアント
Copyright ISE Co,.Ltd.11
<MQ Java インターフェース>
JMS(Java Message Service)
ドメイン(Domains)! Point to point(PTP)
" “キュー宛先”に対してメッセージを送受信するモデル
! Publish/Subscribe(Pub/Sub)" “トピック宛先“に対してメッセージを送受信するモデル
Send
Receive
JMSクライアント キュー
Send
Receive
Point to point(PTP)Point to point(PTP)Point to point(PTP)Point to point(PTP)モデルモデルモデルモデル
JMSクライアント
ブローカー
Publish
Subscribe
トピックA トピックB
Publish/Subscribe(Pub/Sub)Publish/Subscribe(Pub/Sub)Publish/Subscribe(Pub/Sub)Publish/Subscribe(Pub/Sub)モデルモデルモデルモデル
JMSクライアント
JMSクライアント
JMSクライアント
JMSクライアント
JMSクライアント
Copyright ISE Co,.Ltd.12
<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メッセージで、ユーザ指定の要素名で値を取り出せる
Copyright ISE Co,.Ltd.13
<MQ Java インターフェース>
MQ JMS(続き)
MQIがサポートする機能はほぼ使用可能! 同期点制御、メッセージID / 相関IDの利用、レポート・オプションなど! プロバイダ固有のクラス、インターフェースを提供
" アプリケーションのポータビリティは、損なわれる
JMSに準拠したプログラミング手順、デザインが必要! WMQのMQIと同様なプログラミング手順、デザインはできない! 使用できない機能、指定できないオプションがある
" メッセージIDのユーザ設定、セグメンテーション機能、データベース・コーディネーション機能、キューの属性照会(MQINQ)、BROWSEでのメッセージ待ち受け など
グローバル・トランザクションに参加可能
! WASがコーディネータで、MQがリソース・マネージャーとして2フェーズコミットに参加! MQ拡張トランザクショナル・クライアント機能:クライアント接続でも可能! MQデータベース・コーディネーションはできない(MQはコーディネータになれない)
コネクション・プーリングのサポート
! デフォルトで、キュー・マネージャーとの接続をプール" 使われていないコネクションを10個、5分間プール
! コネクション数などはプログラミングで変更可能" MQ Base Javaクラスを利用
Copyright ISE Co,.Ltd.14
<MQ Java インターフェース>
JMSメッセージとMQメッセージJMSクライアントが扱うメッセージは、MQメッセージにマップおよびコピーされる
! MQメッセージ(MQMD)にないJMSメッセージの属性は、MQRFH2ヘッダーに付加" 例)
! MQRFH2ヘッダーを付加せずにメッセージ送信することも可能(次のいずれかの方法)" 管理ツールより管理オブジェクトQueueのTARGCLIENT値を“MQ”と設定" WAS管理コンソールより、キュー宛先のターゲット・クライアントを“MQ”と設定" アプリケーションでDestinationオブジェクトのTargetClient値を
"JMSC.MQJMS_CLIENT_NOJMS_MQ“ と設定する
JMSメッセージ JMSメッセージ
JMSアプリケーション JMSアプリケーションMQメッセージ
コピー
マップ マップ
CidCorrelIdJMSCorrelationID-MsgIdJMSMessageIDDst-JMSDestinationMQRFH2MQMDJMSヘッダ
RFH2データ
MQMDプロパティ
データ
ヘッダープロパティ
データ
ヘッダー
コピー
JMSメッセージ MQメッセージ
コピー
マップ
データ
MQMDプロパティ
データ
ヘッダーMQメッセージ
データ
MQMD
MQアプリケーションJMSアプリケーション
Copyright ISE Co,.Ltd.15
<MQ Java インターフェース>
JMS管理オブジェクト
JMSプロバイダーに接続するための情報を持つ、Javaオブジェクト! 各社メッセージング製品に関する情報を、JMSクライアントから切り離し、アプリケーションのポータビリティーを高めることを目的
! JNDIネーム・スペースに格納される" ファイル、LDAP、WASネーミング・サービス
! JMSクライアントは実行時にネーム・スペースにアクセスし、オブジェクトを取得
JMS管理オブジェクト! コネクション・ファクトリー(接続ファクトリー)
" QueueConnectionFactory / TopicConnectionFactoryキュー・マネージャー名、接続タイプ、 ホスト名、チャネル名、ポート番号 など
! 宛先(Destination)" Queue / Topic : キュー名、トピック名 など
プロバイダーが用意する管理ツールで登録および属性の設定、変更
! JMSAdminコマンド(MQが提供)! WAS V5 管理コンソール
コネクション・ファクトリーQMgr名
宛先
JNDIネームスペース
キュー名/トピック名
JMSクライアント
JMSAdminWAS管理コンソール
登録取得
Copyright ISE Co,.Ltd.16
<MQ Java インターフェース>
JMSのプログラミング手順
プログラミングの流れ(PTPの場合)
パッケージのインポート
キュー・コネクション・ファクトリーの取得
キュー・コネクションの作成、スタート
キュー・センダーの作成
メッセージの作成
メッセージ送信
キューの取得
クローズ
メッセージの取得
メッセージ・タイプの確認
javax.jms*
ConnectionFactoryQueueConnectionFactory
ConnectionQueueConnection
DestinationQueue
MessageProducerQueueSender
QueueSenderのsendメソッド
QueueSender,QueueReceiver,QueueSession,QueueConnection をclose゙
QueueSession のcommit/backout メソッド
QueueReceiverのreceiveメソッドMessage
TextMessage…..
MessageConsumerQueueReceiver
(同期点処理)
SessionQueueSession
MessageTextMessage…..
キュー・セッションの作成
キュー・レシーバーの作成
Copyright ISE Co,.Ltd.17
<MQ Java インターフェース>
サンプル・コーディング(JMS)import javax.jms.*; ・・・・・・・・・・・・・・ 1import javax.naming.*;import javax.naming.directory.*;public static void main(String[] args) {
try{QueueConnectionFactory qcf = (QueueConnectionFactory)context.lookup(qcfname); ・・・・・・・・・・・ 2QueueConnection qc = qcf.createQueueConnection(); ・・・・・・・・・・・・・・・ 3qc.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(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 7outMessage.setText(“テキスト・メッセージ”); sender.send(outMessage); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 8
QueueReceiver receiver = session.createReceiver(queue); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 9Message inMessage = receiver.receive(WaitInterval); ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 10String message = ((TextMssage)inMessage).getText(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 11
sender.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 12receiver.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 13session.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 14qc.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 15
}catch(javax.jms.JMSException ex){
System.out.println(“JMSException occurred.” + ex);}
}
Copyright ISE Co,.Ltd.18
<MQ Java インターフェース>
サンプル・コーディング
1. パッケージのインポート:javax.jms.*IBM提供クラスを使用する場合は、com.ibm.mq.*, com.ibm.mq.jms.* もインポートする
2. JNDIのcontext.lookupで、「qcfname」という名前のキュー・コネクション・ファクトリーを入手3. キュー・コネクションの作成と開始 : createQueueConnection4. キュー・セッションの作成 : createQueueSession
同期点処理を行うかどうかを指定
5. JNDIにて、「qname」というキュー宛先を入手6. キュー・センダーを作成 : createSender7. テキスト・メッセージを作成 : createTextMessage8. キュー・センダーの sendメソッドでメッセージを送信9. キュー・レシーバーを作成 : createReceiver
メッセージの待ち時間をミリ秒単位で指定
10. キュー・レシーバーのreceiveメソッドでメッセージを受信11. 受信したメッセージをテキスト・メッセージとして処理12. キュー・センダーのクローズ13. キュー・レシーバーのクローズ14. セッションのクローズ15. コネクションのクローズ
<ノート>
Copyright ISE Co,.Ltd.19
<MQ Java インターフェース>
Message Driven Bean(MDB)
EJB2.0で決められた新しいタイプのEJB! 非同期実行メカニズムを実現
! メッセージ到着時に、コンテナーによって呼び出されるEJB" EJBクライアントから呼び出すことはできない" Homeインターフェース、リモート・インターフェースがない
JMS宛先(キュー/トピック)にメッセージが到着すると、EJBコンテナがonMessage() を起動! 1メッセージで1インスタンスのみ起動される
" MQのトリガー機能に類似、トリガー・モニターはEJBコンテナ
! 並列にメッセージ受信およびビジネスロジックの実行が可能
! ビジネスロジックは、onMessage() に記述" 受信メッセージは、Message オブジェクトとして参照可能
! メッセージ・セレクターの設定も可能
MDBMDBDestinationJMSクライアント
EJBコンテナ
EJBHomeEJBObject Entity
Session
メソッド呼び出し
MQアプリケーション
メッセージ送信
作成/検索EJBクライアント
メッセージ・オブジェクト
Copyright ISE Co,.Ltd.20
<MQ Java インターフェース>
メッセージ受信
トランザクション開始:
DB更新:
メッセージ送信コミット/ロールバック
MDB(続き)
コンテナが起動時にインスタンスを作成し、コネクション、セッションのプールが可能
! WAS管理コンソールから調整可能
トランザクション機能のサポート
! グローバル・トランザクションを自動的に開始させることが可能" コンテナ管理トランザクションとして設定(CMT)" メッセージ受信とビジネスロジック内のリソース更新(DB、メッセージ送信)とを1UOWとして処理できる
" Required を設定" NotSupportedの場合は、トランザクションは引き継がれない
! ディプロイメント・ディスクリプタにトランザクション定義を行なう
【CMT(Required)設定時のUOW】
コンテナがトランザクションを開始
MDBメッセージ受信:
DB更新:
メッセージ送信
MDB
コンテナがトランザクションをコミット/ロールバック
【BMTのUOW】
Copyright ISE Co,.Ltd.21
<MQ Java インターフェース>
MDBの設定
JMSリスナーポートの設定! MDB起動のためにメッセージを待ちうける論理的な宛先(キュー名)を設定
" コネクション・ファクトリー JNDI名" 宛先(キュー/ トピック) JNDI名
MDB稼働条件は、ディプロイメント・ディスクリプターに設定! WSADで定義可能1. リスナー・ポートの指定
2. メッセージ・セレクターの設定
3. トランザクション設定
キュー・マネージャー
コネクション・ファクトリー
宛先(キュー)
リスナー・ポート 1
宛先(キュー) リスナー・ポート2
リスナー・サービス
アプリケーション・サーバ
MDB1MDB1
MDB2MDB2
JNDIネームスペースEJBココンテナ
キュー1
キュー2
Copyright ISE Co,.Ltd.22
<MQ Java インターフェース>
MDBの設定とプログラミング手順
設定とプログラミングの流れ
! JMS管理オブジェクトとリスナー・ポートはWAS管理コンソールから定義可能! MDBは、WSADで作成支援が可能
パッケージのインポート
各メソッドの作成
ビジネスロジックの作成
キュー・コネクション・ファクトリーの定義
キュー宛先の定義
MDBのデプロイ
設定設定 コーディングコーディング
ejbCreate()ejbRemove()setMessageDrivenContext()
onMessage()
implements javax.ejb.MessageDrivenBean,javax.jms.MessageListener
javax.jms*
MessageDrivenBeanインタフェースMessageListenerインタフェースの実装
リスナー・ポートの定義
MDBとリスナー・ポートの紐付け
Copyright ISE Co,.Ltd.23
<MQ Java インターフェース>
キュー・コネクション・ファクトリーの作成
WebSphere JMS MQ Provider 使用時の例! WAS管理コンソールのナビゲーション・ペインから「リソース」→「WebSphere JMS MQ Provider」を選択! 追加プロパティーから「WebSphere MQ キュー接続ファクトリー」を選択し、作成
Copyright ISE Co,.Ltd.24
<MQ Java インターフェース>
キュー・コネクション・ファクトリーの作成(続き)
キュー・マネージャ名を指定
JNDI名を指定キュー・コネクション・ファクトリーの名前を指定
WebSphere管理ドメインにある JMS 接続ファクトリー内で固有でなければいけない
WebSphere MQ JMS プロバイダーの場合、実際のキュー・マネージャーは、別途MQコマンドで作成しておく
WebSphere JMS プロバイダーの場合は、導入時、自動的に作成される
Copyright ISE Co,.Ltd.25
<MQ Java インターフェース>
キュー宛先の作成
! ナビゲーション・ペインから「リソース」→「WebSphere JMS MQ Provider」を選択! 追加プロパティーから「WebSphere MQ キュー宛先」を選択し、作成
Copyright ISE Co,.Ltd.26
<MQ Java インターフェース>
キュー宛先の作成(続き)
キュー名を指定
JNDI名を指定
キュー宛先の名前を指定
WebSphere MQ JMS プロバイダー
の場合、実際のキューはWAS管理コンソールから作成できないので、別途MQコマンドで作成する
WebSphere JMS プロバイダーの場合は、JMSサーバ構成画面からキュー名を指定するとキューが作成できる
Copyright ISE Co,.Ltd.27
<MQ Java インターフェース>
リスナー・ポートの作成
! ナビゲーション・ペインから「サーバー」→「アプリケーション・サーバー」を選択し、コンテンツ・ペインで、アプリケーション・サーバーの名前を選択
! 「追加プロパティー」から「メッセージ・リスナー・サービス」→「リスナー・ポート」を選択
Copyright ISE Co,.Ltd.28
<MQ Java インターフェース>
リスナー・ポートの作成(続き)
リスナー・ポートによって使用されるキュー宛先のJNDI名を指定
リスナー・ポートによって使用されるキュー・コネクション・ファクトリーの
JNDI名を指定
リスナー・ポートの名前を指定
Copyright ISE Co,.Ltd.29
<MQ Java インターフェース>
MDBとリスナー・ポートの紐付けMDBとリスナー・ポートの紐付けは、WSADにて設定! WSADの「J2EE 階層」より、対象のEJBの「EJB デプロイメント・ディスクリプター」を表示! 「Bean」タブを選択し、リスナー・ポートを指定
リスナー・ポートを指定
Copyright ISE Co,.Ltd.30
<MQ Java インターフェース>
サンプル・コーディング(MDB)
import javax.jms.*; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 1import javax.naming.*;import javax.naming.directory.*;
public class SampleBeanimplements javax.ejb.MessageDrivenBean, javax.jms.MessageListener { ・・・・・・・・・・・・・・・ 2private javax.ejb.MessageDrivenContext fMessageDrivenCtx;
public javax.ejb.MessageDrivenContext getMessageDrivenContext() {return fMessageDrivenCtx;
}
public void setMessageDrivenContext(javax.ejb.MessageDrivenContext ctx) { ・・・・・・・・・・・・・・・ 3fMessageDrivenCtx = ctx;
}
public void ejbCreate() { ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 3}
public void onMessage(javax.jms.Message msg) { ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 4::
}
public void ejbRemove() { ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 3}
}
Copyright ISE Co,.Ltd.31
<MQ Java インターフェース>
サンプル・コーディング
1. パッケージのインポート :javax.jms.*2. MDBはMessageDrivenBeanインタフェースとMessageListenerインタフェースを実装する3. MessageDrivenBeanインタフェースは以下の3つのメソッドを定義する
4. MessageListenerインタフェースは次のようにonMessage()メソッドを定義するここにユーザ・ロジックを書く
public interface MessageDrivenBean{public void ejbCreate();public void ejbRemove();public void setMessageDrivenContext(MessageDrivenContext mdc);
}
public interface MessageListener{public void onMessage();
}
※WSADを使用してMDBを作成する場合、上記インタフェースやメソッドは自動的に生成される
<ノート>
Copyright ISE Co,.Ltd.32
<MQ Java インターフェース>
onMessage()メソッド サンプル・コーディング
public void onMessage(javax.jms.Message msg) { ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 1try{
TextMessage textMsg = (TextMessage)msg; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 2String text = textMsg.getText();
QueueConnectionFactory qcf = (QueueConnectionFactory)context.lookup(qcfname); ・・・・・・・ 3QueueConnection qc = qcf.createQueueConnection(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・4qc.start();
QueueSession session = qc.createQueueSession(Transacted,AcknowlegeMode); ・・・・・・・・・・ 5Queue queue = (Queue)context.lookup(qname); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 6
QueueSender sender = session.createSender(queue); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 7
TextMessage outMessage = session.createTextMessage(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 8outMessage.setText(text); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 9
sender.send(outMessage); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 10
sender.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 11session.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 12qc.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 13
}catch(JMSException ex){
System.out.println("JMSException occur." + ex);}
}
Copyright ISE Co,.Ltd.33
<MQ Java インターフェース>
onMessage()メソッド サンプル・コーディング
1. 引数としてjavax.jms.Messageを受信受信メッセージは、メッセージ・オブジェクトとして渡される
2. メッセージをテキスト・メッセージに変換して変数に格納
3. JNDIのcontext.lookupでキュー・コネクション・ファクトリーを入手4. キュー・コネクションの作成と開始 : createQueueConnection5. キュー・セッションの作成 : createQueueSession
同期点処理を行うかどうかを指定
6. JNDIで宛先キューを入手7. キュー・センダーを作成 : createQueueSender8. テキスト・メッセージを作成 : createTextMessage
9. 送信用のテキスト・メッセージに受信したメッセージをセット
10. キュー・センダーのsendメソッドでメッセージを送信
11. キュー・センダーのクローズ
12. セッションのクローズ
13. コネクションのクローズ
<ノート>
メッセージ送信のための処理
Copyright ISE Co,.Ltd.34
<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メッセージ・オブジェクトまたは引数として扱える
Copyright ISE Co,.Ltd.35
<MQ Java インターフェース>
Extended Messaging Service(EMS)
メッセージとJavaオブジェクト間のデータマッピング機能を提供! メソッド引数とJMSメッセージの変換を行なう
" アプリケーションは、JMSメッセージ構造を知らなくても良い
トランザクション機能
! 受信側Beanの受信メッセージと送信メッセージを1UOWにすることが可能" コンテナ管理トランザクション(CMT)
Copyright ISE Co,.Ltd.36
<MQ Java インターフェース>
EMSによるメッセージング・シナリオの例
SenderBean
ビジネスロジックEJB
sendWithResponse(...)
リターン
EJBコンテナ
キュー・マネージャー
コネクション・ファクトリー
宛先(キュー)
宛先(キュー)
JNDIネームスペース
出力
ポート
【送信側Bean 同期応答受信あり】
MQメッセージ
ReceiverBean
(MDB)
ビジネスロジックEJB
onMessage(...)
リターン
EJBコンテナ
リスナー
ポート
【受信側Bean(MDB)、同期応答送信あり】
method(...)
送信側:同期応答受信あり + 受信側:MDB、同期応答送信あり の組み合わせ! 送信側Bean(SenderBean)
" アプリケーションEJBが送信側Beanをコールし、データを渡す" 送信側Beanがメッセージを送信し、応答を受信する" 応答がアプリケーションEJBに戻される
! 受信側Bean(ReceiverBean)" JMSメッセージが到着するとMDBとして作成された受信側Beanが起動される" 受信側BeanはユーザのビジネスロジックEJBをコールし、リターンを待つ" 受信側BeanはアプリケーションEJBの戻り値から応答メッセージを作成し、オリジナル・メッセージに設定されている宛先に送信する
Copyright ISE Co,.Ltd.37
<MQ Java インターフェース>
EMSによるメッセージング・シナリオの例送信側:非同期応答受信あり + 受信側:アプリケーション呼び出し可能受信側Bean、応答送信あり の組み合わせ! 送信側Bean(SenderBean)
" EJBアプリケーションが送信側Beanの送信要求メソッドをコールし、データを渡す" 送信側Beanがメッセージを送信し、Correlatorを戻す" EJBアプリケーションはCorrelatorを引数に、送信側Beanの応答要求メソッドをコールする
! 受信側Bean(ReceiverBean)" EJBアプリケーションが受信側Beanの受信要求メソッドをコールする" 受信側Beanは、宛先をpollし、メッセージが到着したらアプリケーションEJBにデータを戻す" EJBアプリケーションは、受信側Beanの応答送信要求メソッドをコールし、受信側Beanが応答メッセージを送信する
SenderBean
ビジネスロジックEJB
sendDeferredResponse(...)EJBコンテナ
キュー・マネージャー
コネクション・ファクトリー
宛先(キュー)
宛先(キュー)
JNDIネームスペース
出力
ポート
MQメッセージ
ApplicationCallableReceiver
Bean
ビジネスロジックEJB
receive(...)
EJBコンテナ
入力
ポート
sendReply(...)
【送信側Bean 非同期応答受信あり】【アプリケーション呼び出し可能受信側Bean
非同期応答送信あり】
receiveResponse(...)
Copyright ISE Co,.Ltd.38
<MQ Java インターフェース>
送信側Beanの開発
メソッド名は自由に設定
応答情報の指定
出力ポートの指定
データ・マッピング機能の利用の有無を指定
メッセージ・フォーマットを識別するためのIDJMSTypeにマッピングされる
Copyright ISE Co,.Ltd.39
<MQ Java インターフェース>
受信側Beanの開発
応答情報の指定
データマッピング機能の利用の有無を指定
メッセージ・フォーマットを識別するためのIDJMSTypeにマッピングされる
MDB内部からコールされるアプリケーションEJBのメソッドの指定
Copyright ISE Co,.Ltd.40
<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();
}
Copyright ISE Co,.Ltd.41
<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);return;
・・・
Copyright ISE Co,.Ltd.42
<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();}
}
Copyright ISE Co,.Ltd.43
<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();}
}
Copyright ISE Co,.Ltd.44
<MQ Java インターフェース>
ポートの作成
Copyright ISE Co,.Ltd.45
<MQ Java インターフェース>
出力ポートの作成
Copyright ISE Co,.Ltd.46
<MQ Java インターフェース>
入力ポートの作成
Copyright ISE Co,.Ltd.47
<MQ Java インターフェース>
前提S/W
主な前提ソフトウェア
サポートパックMA0FN/AV5.2V5.3
V1.3AMI
サポートパックMA88WMQ V5.3製品CDに付属
必須ではないV5.2V5.3
V1.3.1MQ Base Java
WAS V5が提供V5V5.3V1.3.1MDBWASV5 Enterprise が提供V5 EnterpriseV5.3V1.3.1EMS
必須ではないV5.2V5.3
V1.3.1JMS サポートパックMA88WMQ V5.3製品CDに付属WAS V5製品に付属
備考WASMQWMQ
JDK
注) 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のバージョンは、プラットフォームによって若干異なる