MQ Java インターフェース ISE Web & Transaction System 2003年7月
by user
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.