メッセージング・インターフェースと利用法 トピック 2004/06/14 IBM WebSphere MQ
by user
Comments
Transcript
メッセージング・インターフェースと利用法 トピック 2004/06/14 IBM WebSphere MQ
<MQ-WAS連携-第2章> メッセージング・インターフェースと利用法 2004/06/14 <MQ-WAS連携-第2章> トピック IBM WebSphere MQのJavaインターフェース MQ Base Java Java Message Service(JMS) Message Driven Bean(MDB) Extended Message Service(EMS) メッセージング・インターフェースの利用法 Webアプリケーション・サーバー間の連携 サーバ・アプリケーション 監視アプリケーションの作成 既存アプリケーションとの連携 メッセージングによるアプリケーション連携 メッセージング・ミドルウェアの今後 2 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> IBM WebSphere MQのJava インターフェース(1) MQ Base Java WebSphere MQ(WMQ)専用のメッセージング・インターフェース MQI(Message Queuing Interface)そのままのイメージでコーディング可能 Java Message Service(JMS) J2EE標準のメッセージング・インターフェース WMQおよび、WebSphere Application Server(WAS) でサポート Application Messaging Interface(AMI) OAG(Open Application Group)が標準化したメッセージング用のAPI MQIより高度に抽象化されたAPI MQIの各種パラメータを、外部ファイルにパラメータ・セットとして外出し パラメータ・セットのファイルはGUIで設定することも可能 アプリケーションは、パラメータ・セットを使ってメッセージを送受信 C、C++、Java 3 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> IBM WebSphere MQのJava インターフェース(1) <Note> MQのJavaインターフェースには次の5つがあります。 MQ Base Java MQ Base JavaはWebSpere MQが提供する独自のインターフェースです。CやCOBOLなどのMQIと同じプログラミング手 順、デザインが可能です。また、MQIがサポートする機能はすべて使用することができますので、既存のMQシステムとの相性が 良く、連携が容易です。 Java Message Service(JMS) JMSはサン・マイクロシステムズが中心となって標準化されたメッセージング・インターフェースです。MOM製品に依存しないアプ リケーションの構築が可能なので、アプリケーション・ポータビリティが高いといえますが、WMQのすべての機能を使用することがで きるわけではありません。 Application Messaging Interface(AMI) AMIはOAGが標準化したメッセージング用のインターフェースです。MQIより高度に抽象化されたAPIでアプリケーションが行う 処理を簡単に記述できるように考慮されたインター・フェースです。CやC++、COBOLの他にJavaのインターフェースも提供し ています。 AMIはDB2のMQ UDFという機能で使用されています。MQ UDFにより、SQLからMQSEND/MQRECEIVEなどのユーザ 関数でMQへのメッセージ書き込み/読み込みが可能です。 4 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> IBM WebSphere MQのJava インターフェース(2) Message Driven Bean(MDB) J2EE標準のメッセージ駆動型処理を行うEJB JMSの機能を使用して実装 WAS V5からサポート Extended Messaging Service(EMS) IBMが拡張した機能で、EJBにメッセージング機能を統合 送信側Bean(SenderBean) :メッセージ送信と応答受信 受信側Bean(ReceiverBean) :メッセージ受信と応答送信 開発者から、メッセージング(JMS)の詳細な設定を隠蔽 WAS Enterprise V5 でサポート 5 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> IBM WebSphere MQのJava インターフェース(2) <Note> Message Driven Bean(MDB) MDBはEJB2.0で新たに決められたEJBで、Web環境で非同期メカニズムを実現するメッセージ・コンシューマーです。JMS宛 先(キュー/トピック)にメッセージが到着したことをトリガーにEJBコンテナーにより起動されます。JMS宛先を起点としているため、 既存のJMSアプリケーションとの統合を比較的容易に行うことができます。 Extended Message Service(EMS) EMSはWAS Enterprise V5で使用することができるIBM独自のインターフェースで、EJBに基づいたプログラミング・モデルを 提供しています。EMSを使用するに際して、JMSのプログラミングに関する知識は必要ありません。EMSの実行環境が、 JMSへのインターフェースをハンドルします。開発ツール(WSAD IE V5)のウィザードで メッセージBeanを作成することができ、 メッセージング・ベースのアプリケーションが簡単に作成できます。 6 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> 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 7 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> MQ Base Java <Note> MQ Base Javaは、WebSphere MQが提供する独自のインターフェースです。CやCOBOLなどのMQIの Java版であるため、従来のMQアプリケーションと同様のデザイン、プログラミング手順で作成することが出来ます。 MQのアプリケーションの開発を経験したことがあれば、理解しやすいインターフェースです。 MQIがサポートしている機能は、MQ Base Javaですべて使用することができます。したがって、メッセージIDや相 関ID、グループ・メッセージ機能などMQの機能を使用した既存のシステムとも容易に連携することが可能です。 また、データベース・コーディネーションもサポートしており、MQがTM(トランザクション・マネージャー)となり、メッ セージとDBの2フェーズ・コミットを行うことが出来ます。 MQ Base Javaでも、キュー・マネージャーに対してローカル接続とクライアント接続をすることが出来ます。クライ アント接続をする場合、別途、MQクライアントを導入する必要はありません。MQ Base Javaがクライアントの 機能を持っています。 8 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> MQ Base Javaのプログラミング手順 com.ibm.mq.* パッケージのインポート (接続環境の設定) キュー・マネージャーと接続 new MQQueueManager() accessQueue() キューのオープン MQQueue() new MQMessage() メッセージの作成 送信オプションの指定 (受信オプションの指定) new MQPutMessageOptions() new MQGetMessageOptions() put() get() メッセージの送信 (メッセージの受信) (同期点処理) commit/backout キューのクローズ close() キュー・マネージャーから切断 disconnect() Copyright ISE Co,.Ltd 9 <MQ-WAS連携-第2章> サンプル・コード(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"); } } } 10 ・・・・・・・・・・・・・・・・・・・・・・・・・ 7 ・・・・・・・・・・・・・・・・・・・・・・・・・ 8 ・・・・・・・・・・・・・・・・・・・・・・・・・ 9 ・・・・・・・・・・・・・・・・・・・・・・・・・10 ・・・・・・・・・・・・・・・・・・・・・・・・・11 ・・・・・・・・・・・・・・・・・・・・・・・・・12 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> サンプル・コード(Base 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. キュー・マネージャから切断 11 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> blank page 12 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> Java Message Service(JMS) Java環境での標準メッセージング・インターフェース サン・マイクロシステムズ㈱が中心となって標準化されたAPI仕様 製品に依存しないアプリケーション構築が可能 Æ アプリケーション・ポータビリティ プロバイダー間の相互接続については保障されていない 各ベンダーが提供するメッセージング製品にて実装される JMSプロバイダー(Provider) JMSクライアントの実行環境を提供する メッセージング製品のJMSの実装クラスを提供 JMSプロバイダー プロバイダー JMSクライアント(Client) JMSインターフェースにより、メッセージ・サービス WMQ を使用するアプリケーション JMS クライアント 2つのドメイン JMS 他社メッセー ジング製品 JMS JMS クライアント 他社メッセー ジング製品 Point to point(PTP) “キュー宛先”に対してメッセージを送受信するモデル メッセージング・サービス Publish/Subscribe(Pub/Sub) “トピック宛先“に対してメッセージを送受信するモデル キューを利用:フル機能を提供 ダイレクトIP接続:高速通信、マルチキャスト、機能制限あり Copyright ISE Co,.Ltd 13 <MQ-WAS連携-第2章> Java Message Service(JMS) <Note> JMSは、サン・マイクロシステムズ㈱社が中心となって標準化を行ったメッセージング・インターフェースです。JMS 自体はメッセージング・システムではなく仕様です。JMSは各メッセージング製品(MOM)を提供するベンダーに よって実装されます。JMSの仕様に沿って作成されたアプリケーションは、製品に依存しないポータビリティの高い ものとなりますが、逆に、各ベンダーの製品が持つそれぞれの特徴から独立したコーディングになります。 JMSでは、JMSインターフェースを使用してメッセージ・サービスを使用するアプリケーションをJMSクライアントと呼 び、JMSクライアントの実行環境を提供する製品をJMSプロバイダーと呼びます。 JMSにはPoint to Point(PTP) とPublish/Subscribe(Pub/Sub)の2つのモデルがあります。これらはドメインと 呼ばれ、PTPはキュー宛先に対してメッセージの送受信を行うモデルで、送信アプリケーションが別の1つのアプリ ケーションに対してメッセージを送信します。Pub/Subはトピック宛先に対してメッセージを送受信するモデルです。 送信アプリケーションから複数のアプリケーションに対してメッセージを送信できます。PTPの場合と違って、 Pub/Subでは複数のアプリケーションが同じメッセージを受信できます。 Pub/Subモデルは、データを送信する「パブリッシャー」、 データを受信する「サブスクライバー」と両者の仲介をする 「ブローカー」で構成されます。 ブローカー機能はサポートパックやWBI Message Broker/ Event Brokerで提供されています。 WBIMBでは、キューを利用したPub/Subモデルだけでなく、 ダイレクトIP接続も対応できるブローカーです。 パブリッシャー 「株価」情報 IBM1万$ 1 パブリッシャー 2 「サッカー」情報 ユベントスWIN ブローカー 「株価」購読 「株価」購読 サブスクライバー 「株価」購読 1 サブスクライバー 「サッカー」購読 3 サブスクライバー 2 14 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> MQ JMS IBMで提供するJMSプロバイダーは、WebSphere MQ(WMQ) WMQにアクセス可能な、JMSインターフェースを実装したJavaクラスを提供 MQローカル接続 / クライアント接続が可能:MQクライアントの導入は不要 PTPとPub/Subモデルをサポート Pub/Subブローカーは、サポートパックまたは別製品(WBIMB、WBIEB) JMS特有の機能を提供 メッセージ・リスナー、メッセージ・セレクター、豊富なメッセージ・クラスの提供など グローバル・トランザクションに参加可能 TPモニタ(WAS)の配下で、MQがリソース・マネージャーとして2フェーズコミットに参加 MQデータベース・コーディネーション機能はサポートされていない(MQはコーディネータになれない) WMQがサポートする機能は、ほぼ使用可能 使用できない機能 グループ・メッセージ、キューの属性照会(MQINQ)、コンテキスト情報の利用、PCFコマンドなど プロバイダ固有のクラス、インターフェースを提供 アプリケーションのポータビリティは、損なわれる JMSに準拠したプログラミング手順、デザインが必要 WMQのMQIと同様なプログラミング手順、デザインはできない 既存のMQアプリケーションと接続する場合は注意が必要 15 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> MQ JMS <Note> IBMが提供するJMSプロバイダーは、WebSphere MQ(WMQ)です。JMSでWMQにアクセスするためのクラス を提供しており、PTP、Pub/SubモデルやJMS固有の機能をサポートしています。MQ JMSでアプリケーションを 作成する場合は、JMSに準拠したプログラミング手順やデザインが必要になるので、これまでのMQIでの手法と は異なります。 JMSは、メッセージング製品にアクセスするためのJ2EEの仕様なので、各ベンダーの製品の特徴から独立してい ます。そのため、グループメッセージやレポート機能などの様なWMQが持っている一部の機能を使用することが出 来ません。もしくは、JMS拡張機能やIBM拡張機能を使用しなければ実現できない機能もあります。MQ Base Javaと違い、既存のMQシステムと連携するアプリケーションを作成する場合は考慮が必要です。 MQ JMSの機能や使用する際の考慮点の詳細に関しては、 ワークショップ資料「WMQ Java インターフェース(Base & JMS)」を参照ください 16 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> JMS管理オブジェクト プロバイダーに接続するための情報を持つ、Javaオブジェクト JMSプロバイダーの提供するメッセージング製品に関する情報を、JMSクライアントから切り離 すことでアプリケーションのポータビリティーを高める JNDIネーム・スペースに格納される ファイル、LDAP、WAS JMSクライアントは実行時にネームスペースにアクセスし、オブジェクトを取得 JMS管理オブジェクト コネクション・ファクトリー キュー・マネージャー名、接続タイプ、 ホスト名、チャネル名 など 宛先(Destination) キュー名、トピック名など JNDIネームスペース プロバイダーが用意する管理ツールで登録、 および属性の設定、変更 JMSAdminコマンド(MQが提供) WAS コネクション・ファクトリー QMgr名 V5では未サポート 取得 WAS V5 管理コンソール JMS クライアント 17 宛先 キュー名/トピック名 登録 JMSAdmin WAS管理コンソール Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> JMS管理オブジェクト <Note> JMS管理オブジェクトは、JNDIに登録されるオブジェクトで、JMSクライアントにより使用される構成情報を定義 します。JMSプロバイダー固有の情報をJMS管理オブジェクトにカプセル化することで、JMSクライアントのポータビ リティーが高まります。JMSクライアントはJNDIに登録してあるオブジェクトをlookupすることでJMSのサービスを利 用できるようにします。 JMS管理オブジェクトには、コネクション・ファクトリーと宛先(Destination)があります。コネクション・ファクトリーには JMSプロバイダーの情報(キュー・マネージャー名や接続タイプ、ホスト名など)がカプセル化されています。宛先に はキュー名やトピック名がカプセル化されています。JMSクライアントはコネクション・ファクトリーに接続し、宛先に 対してメッセージを送受信します。 管理オブジェクトを定義/変更するツールとして、WMQが提供するJMSAdminコマンドとWASの管理コンソールが 提供されています。 WMQとWAS V5とで連携する場合、WASのネームスペースにJMS管理オブジェクトを登録するにはWAS管理コン ソールを使用します。JMSAdminを使用してWAS V5のネームスペースに登録することはサポートされていません。 18 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> JMSのプログラミング手順(PTPの場合) javax.jms.* パッケージのインポート キュー・コネクション・ファクトリーの取得 QueueConnectionFactory キューの取得 Queue キュー・コネクションの作成、スタート createQueueConnection() QueueConnection start() キュー・セッションの作成 createQueueSession() QueueSession 送信の場合 キュー・センダーの作成 受信の場合 createSender() キュー・レシーバーの作成 createReceiver() QueueSender QueueReceiver createTextMessage() メッセージの作成 TextMessage メッセージの送信 send() メッセージの取得 (同期点処理) キュー・センダーのクローズ receive() commit()/rollback() close() キュー・レシーバーのクローズ キュー・セッションのクローズ close() close() close() キュー・コネクションのクローズ 19 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> サンプル・コード(JMS) <参考> ・・・・・・・・・・・・・・ 1 import javax.jms.*; import javax.naming.*; public static void main(String[] args) { try{ QueueConnectionFactory qcf = (QueueConnectionFactory)context.lookup(“QcfName”); ・・・・・・・・・ 2 Queue queue = (Queue)context.lookup(“QName”); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 3 QueueConnection qc = qcf.createQueueConnection(); qc.start(); ・・・・・・・・・・・・・・・ 4 QueueSession session = qc.createQueueSession(false,Session.AUTO_ACKNOWLEDGE); ・・・・・・ 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(10000); String message = ((TextMssage)inMessage).getText(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 9 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 10 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 11 sender.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 12 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 13 receiver.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 8 session.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 14 qc.close(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 15 } catch(javax.jms.JMSException ex){ System.out.println(“JMSException occurred.” + ex); } } 20 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> サンプル・コード(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メソッドでメッセージを受信 メッセージの待ち時間をミリ秒単位で指定 受信したメッセージをテキスト・メッセージとして処理 キュー・センダーのクローズ キュー・レシーバーのクローズ セッションのクローズ コネクションのクローズ 21 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> blank page 22 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> Message Driven Bean(MDB) EJB2.0で決められた新しいタイプのEJB Web環境で非同期メカニズムを実現 メッセージ到着時に、EJBコンテナによって呼び出されるメッセージ・コンシューマ Homeインターフェース、Remoteインターフェースがない EJBクライアントから直接呼び出すことはできない 並列にメッセージ受信およびビジネスロジックの実行が可能 ビジネスロジックは、void onMessage(Message) に記述 オブジェクトとして参照可能 受信メッセージは、Message EJBコンテナが起動時にインスタンスを作成し、プールすることが可能 トランザクション機能のサポート コンテナ管理トランザクション(CMT) コンテナーが自動的にトランザクションを開始、終了する メッセージ受信とビジネスロジック内のリソース更新(DB、メッセージ送信)とを1UOWとして処理できる ビーン管理トランザクション(BMT) コーディングで明示的にトランザクションの開始、終了を制御する メッセージ送信 EJBコンテナ メッセージ・オブジェクト JMSクライアント MDB MDB Destination MQアプリケーション 23 onMessage() onMessage() Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> Message Driven Bean(MDB) <Note> MDBはEJB2.0で決められた新しいタイプのEJBで、javax.ejb.MessageDrivenBeanインターフェースと javax.jms.MessageListenerインターフェースを実装する、非同期のメッセージコンシューマーです。MDBは、リクエ スト間で状態を保持しない等、Stateless Session Beanと似ていますが、HomeインターフェースやRemoteイン ターフェースが無く、EJBクライアントから直接呼び出すことができないなど大きく違う点があります。 MDBにはonMessage()メソッドがあり、JMS宛先にJMSメッセージが到着すると、EJBコンテナーによって自動 的にonMessage()メソッドが実行されます。onMessage()メソッドの中にビジネスロジックを書き加えることができ、 受信したメッセージ内容をMessageオブジェクトとして参照することができます。 MDBはEJBコンテナーによって管理されているので、EJB コンテナ・トランザクションへの参加や並列実行時のリ ソース・プーリングなどの恩恵に与ることができます。 24 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> MDBの設定とプログラミング手順 アプリケーション・サーバー キュー・マネージャー JNDIネームスペース コネクション・ファクトリー キュー宛先 宛先(キュー) WAS管理コンソールにて定義 リスナー・ ポート MDBとリスナー・ポートの紐付けを デプロイメント・ディスクリプターに定義 MDB パッケージのインポート import javax.jms.*; MDBクラスの定義 public class SampleBean implements javax.ejb.MessageDrivenBean, javax.jms.MessageListener 必須メソッドの作成 ejbCreate() ejbRemove() setMessageDrivenContext() ビジネスロジックの作成 onMessage() 25 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> MDBの開発 WSADのウィザードにより、MDBの雛形を作成することができる ユーザは、ロジックをonMessage()に記述するだけでよい トランザクションの設定 MDBの作成 宛先タイプの設定 Bean名の指定 26 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> サンプル・コード(MDB) <参考> public class SampleBean implements javax.ejb.MessageDrivenBean, javax.jms.MessageListener { private javax.ejb.MessageDrivenContext fMessageDrivenCtx; ・・・・・・・・・・・・・・・ 1 public javax.ejb.MessageDrivenContext getMessageDrivenContext() { return fMessageDrivenCtx; } public void setMessageDrivenContext(javax.ejb.MessageDrivenContext ctx) { fMessageDrivenCtx = ctx; } ・・・・・・・・・・・・・・・ 2 public void ejbCreate() { } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 2 public void onMessage(javax.jms.Message msg) { : : } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 3 public void ejbRemove() { } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 2 } 27 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> サンプル・コード(MDB) <参考> 1. MDBはMessageDrivenBeanインターフェースとMessageListenerインターフェースを実装する 2. MessageDrivenBeanインターフェースは以下の3つのメソッドを定義する public interface MessageDrivenBean{ public void ejbCreate(); public void ejbRemove(); public void setMessageDrivenContext(MessageDrivenContext mdc); } 3. MessageListenerインターフェースは以下のようにonMessage()メソッドを定義する このメソッドにユーザ・ロジックを書く public interface MessageListener{ public void onMessage(); } ※WSADを使用してMDBを作成する場合、上記インターフェースやメソッドは自動的に生成される 28 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> Extended Messaging Service(EMS) WAS Enterprise V5でサポートするIBM独自のインターフェース メッセージ送受信の機能をサーバサイドのコンポーネントとして提供 送信側Bean(SenderBean) :メッセージの送信、応答の受信を行なう 応答の待ち方が選択できる(同期応答、据え置き応答、応答なし) トランザクションはCMTベース 受信側Bean(ReceiverBean):メッセージの受信、応答の送信を行なう 2種類の受信側Beanが利用可能 –MDBとして生成される受信側Bean –アプリケーションから呼び出しが可能な受信側Bean(Stateless Session Bean) 応答の送信方法が選択できる(同期応答、非同期応答、応答なし) トランザクションはBMT、CMTをサポート Bean開発者にわかりやすいプログラミング・モデル JMS管理オブジェクトを意識する必要がない 論理的なコンポーネント(入力ポート/出力ポート/リスナー・ポート)に対してメッセージを送受信 メッセージとJavaオブジェクト間のデータマッピング機能を提供 メソッド引数とJMSメッセージの変換を行う Æ JMSメッセージ構造を意識する必要がない 実際のメッセージ処理の流れに沿ってアプリケーション開発が可能 29 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> Extended Messaging Service(EMS) <Note> EMSは、WAS Enterprise V5でサポートするIBM独自の機能です。 EMSではEJB2.0に基づいた簡単なプログラミング・モデルを提供し、WASへメッセージング機能を取り込む方法 としてのJMSやMDBを拡張した機能と言えます。 EMSによって提供されるメッセージ送受信の形態は次のとおりです。これらのEMSを、実際のメッセージ処理の 流れに組み合わせてアプリケーションを開発します。 メッセージの送信 応答なしのリクエストの送信 同期応答を受信するリクエストの送信 据え置き応答を受信するリクエストの送信 メッセージの受信 キューにメッセージが到着したことをトリガーとしてメッセージを受信 アプリケーションからの呼び出しでメッセージを受信 応答の送信 EMSを使用することで、次のメリットを受けることが出来ます。 EMSによってメッセージング部分が管理されるため、JMSの使用法が隠蔽されます。EMSは入力ポートや出力ポート、リス ナー・ポートといった、論理的なコンポーネントを通してメッセージを送受信しますので、開発者はメッセージングを意識する必要 がありません。 メッセージング部分とビジネス・ロジックを分離することが出来ます。 EMSが提供するデータ・マッピング機能によって、メソッドの引数とJMSメッセージ間の相互変換を行います。EMSを使用する アプリケーションはEJBクライアントからEJBを呼び出すのと同様のイメージで、呼び出すことが出来ます。 開発ツール(WSAD IE)を使用することで、容易にメッセージング・ベースのアプリケーションを開発することができます。 30 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> EMSによるメッセージング・シナリオ EMSを使用した非同期通信の例 「送信側:据え置き応答受信あり」 + 「受信側:同期応答送信あり」を使用 ③Correlator Business Logic EJB ⑦応答要求 (Correlator) ⑨応答受信 送信側 Bean ④メッセージ受信 出力ポート ②メッセージ 送信 ①送信要求 ⑤受信側 Bean起動 リスナー・ ポート ⑧メッセージ 受信 受信側 Bean (MDB) ) Business Logic EJB ⑥応答メッセージ 送信 送信側Bean アプリケーションが送信側Beanを呼び出し、データを送信する 送信側BeanがJMSメッセージの作成と送信後、応答をアプリケーションに戻す アプリケーションから応答の受信要求を送信側Beanに出し、応答を受信する 受信側Bean キュー宛先にメッセージが到着すると、受信側Beanが起動される 受信側Beanはアプリケーションを呼び出し、リターンを待つ 受信側Beanはアプリケーションの戻りからJMSメッセージを作成し、応答を送信する 31 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> EMSの開発 WSADのウィザードにより、送信側Bean/受信側Beanが簡単に作成できる 既存のMDBやStateless SessionBeanから変換/更新することも可能 ユーザーでコーディングする必要はない 32 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> EMSの開発 <参考> 送信側Beanの作成例 【送信メソッドの指定】 【送信側Beanの作成】 Session Beanの作成/選択 出力ポートの指定 応答方法の指定 データ・マッピングの指定 遅延応答の設定 次ページへ Copyright ISE Co,.Ltd 33 <MQ-WAS連携-第2章> EMSの開発 <参考> 【データ・マッピングの設定】 【データ・マッピングの設定】 戻り値の型の指定 メソッドの引数の指定 設定方法の選択 例外の型の指定 34 次ページへ Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> EMSの開発 <参考> 【確認画面】 35 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> サンプル・コード(EMS) <参考> 送信側Bean(メッセージ送信部分) public CMMResponseCorrelator sendDeferredResponse(String arg0, String arg1, int arg2) throws CMMException { // create_sender_statement CMMSender sender = CMMFactory.createSender("ems/oPort"); try { // メッセージ・ファクトリーの作成 MessageFactory factory = sender.getMessageFactory(); // フォーマッターの作成 CMMFormatter formatter = CMMFactory.createCMMFormatter(factory); // メッセージにパラメーターを追加 formatter.addStringParameter(arg0); formatter.addStringParameter(arg1); formatter.addIntParameter(arg2); // メッセージの取得 Object request = formatter.getMessage(); // メッセージ型の設定 sender.setRequestMessageType("EMSFormat_0"); // 要求送信応答受信 return sender.sendRequestDeferredResponse(request); } finally { sender.close(); } } 36 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> サンプル・コード(EMS) <参考> 送信側Bean(メッセージ受信部分) public String receiveResponse(CMMResponseCorrelator corr, long timeout) throws CMMException { // create_sender_statement CMMSender sender = CMMFactory.createSender("ems/oPort"); try { // 応答の受信 Object response = sender.receiveResponse(corr, timeout); // 構文解析プログラムの作成 CMMParser parser = CMMFactory.createCMMParser(response); // 処理例外 if (parser.containsException()){ try{ throw parser.getException(); } catch(CMMException exc){ throw exc;} catch(Exception exc){ throw new CMMException("Unexpected Exception", exc);} } // 応答を抽出して戻る return parser.getStringParameter(); } finally { sender.close(); } } 37 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> blank page 38 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> Webアプリケーション・サーバ間のメッセージ連携 Webアプリケーション・サーバ間でメッセージによるデータの送受信を行う 一括処理 長時間処理 時間差処理 :バッチのオンライン化(センタ一括処理)、集計処理 :大規模DB検索、大容量ファイル転送 :ディレード処理、データ配布 JMSで実装 J2EE標準、アプリケーション・ポータビリティ JMS同士であれば特有の機能が利用できる セレクタ、マップ・メッセージ、Publish/Subscribe型通信 など 開発者にメッセージングを意識させないアプリケーション開発をしたい場合は、EMSで実装 送受信ともにEMSが有効 待受け型のサーバ・アプリケーションは、MDBを利用 Base Javaで実装 MQIのデサイン・スキルの活用 WASの元で2フェーズコミットに参加できない Web HTTP サーバ フロントエンド・ アプリケーション・サーバ JMS 39 バックエンド・ アプリケーション・サーバ MDB JMS MDB アプリケーション・サーバ Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> Webアプリケーション・サーバ間のメッセージ連携 <Note> 次のようなケースでは、Webアプリケーション・サーバ間のデータ送受信に、メッセージを利用すると有効です。 バッチ処理や集計処理などの一括処理 大規模なDB検索やファイル転送など、処理時間がかかる業務 処理時間に差があるデータ配布やディレード処理など 送信側/受信側ともにWebアプリケーションで新たに作成する場合は、J2EE標準という理由からJMSインター フェースを利用します。メッセージを送信する側と受信する側がお互いにJMSの場合のみ、JMS特有の便利な 機能が利用できます。 リクエストを待ち受けるサーバ側のアプリケーションはMDBを、また開発者にJMSメッセージを意識させたくない場 合はEMSを利用します。 Webアプリケーション・サーバ間のメッセージ連携には、もちろんBaseJavaでの開発も可能です。すでにWMQを 使用してアプリケーション開発経験のある技術者が多い場合は、そのスキルを活用できます。ただし、WASが コーディネータとなった場合の2フェーズコミットに参加できないので、要件によっては使用できません。 40 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> 適用分野例(ディレード処理) <参考> オンライン取引情報から即時、情報系データの構築 ユーザ取引ログを分類して、メッセージとして出力 バックエンド業務システムで、情報系DBの構築やドキュメントの作成、印刷などを実行 一方向型のメッセージ送信 メッセージング利用のメリット 開発の容易性 取引ログをデータベースに持つと、物理設計が複雑 システム構成変更に柔軟に対応 ⇒ キュー構成の変更で対応可 負荷状況に対応した、バックエンド業務システムの構成変更が容易 バックエンド・システムを再構築してもフロント・システムの変更は不要 フロントエンド業務システム バックエンド業務システム 照会業務 オンライン取引 Web MDB DB更新 更新 :更新 DB更新 MSG送信 :送信 MSG送信 送信 DB更新 更新 情報系DB 構築 MDB 41 PDF作成 作成 印刷 など Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> 適用分野例(ディレード処理) <Note> 業務取引情報から情報系データを作成するディレード処理は、非同期通信に適した業務です。 フロントエンドの業務システムでは、オンライン取引処理を行った後、ユーザ取引ログを分類して、JMSやBase Javaでメッセー ジとしてバックエンド業務システムに渡します。 メッセージを受け取ったバックエンド業務システムでは、MDBがメッセージを受け取って情報系DBを更新したり、印刷処理や PDFファイル作成など、オンライン業務と切り離した時間差のある処理を行います。 メッセージングを利用すると、バックエンド・システムの構成変更にもアプリケーションの変更なくキューの変更のみで 容易に対応できるなどのメリットがあります。 42 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> サーバ・アプリケーションの構築 MDBを利用したメッセージ駆動型処理 リクエスト・メッセージが到着したら、MDBが呼び出される MQでの常駐型アプリケーションに類似した処理が可能 MDB使用時の考慮点 同期点(UOW) MDBを起動する受信メッセージと呼び出されるビジネス・ロジック内でのリソース更新の同期点範囲 多重度の制御 同時に処理するスレッド数の制御 順序処理の必要性 メッセージがシーケンシャルに処理される必要がある場合の実装方法 ポイズン・メッセージ 障害時、メッセージのバックアウトをループさせない仕組み 複数メッセージ処理 アプリケーション・サーバ HTTP サーバ JMS HTTP サーバ JMS Web 43 ビジネス・ MDB ロジック ビジネス・ MDB ロジック ビジネス・ MDB ロジック Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> サーバ・アプリケーションの構築 <Note> メッセージによるリクエストを待ち受けて処理を開始するサーバ・アプリケーションを構築するには、MDBが便利で す。MDBの仕組みは、MQのトリガー機能に類似したものと考えられます。 MDBを使用する際には、同期点の範囲、同時に稼動させるMDBの数、メッセージ処理の順序性が必要かどう か、ポイズン・メッセージの扱いなどに注意する必要があります。詳細は、5章で説明します。 44 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> 監視アプリケーションの作成 メッセージング利用時の運用/管理上の考慮点 アプリケーションは、ビジネスロジックに注力し、相手側の稼動状況確認などは不要 運用管理の観点からの、キューやチャネルの監視が必要 アプリケー ション MQチャネル running アプリケー ション 【受信アプリケーションが停止しているため、キューにメッセージが滞留している例 】 WebSphere MQオブジェクトの監視/管理 宛先(キュー)に滞留しているメッセージ数の監視 MQチャネルの稼動状況の監視 キュー書き込み禁止によるアプリケーションの停止 キューのクリア Base Javaで実装 inquire()メソッド(MQINQに相当)などによるキュー属性の照会 MQのPCF(Programmable Command Format)によるオブジェクト操作 JMSでは困難 現在のところ、JMXでは未対応 45 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> 監視アプリケーションの作成 <Note> MQを利用すると、相手側アプリケーションの稼動状況に依存せずにメッセージ送信が可能なため、アプリケーショ ンはビジネスロジック作成のみに注力できます。しかし、アプリケーションが簡単になる反面、運用管理側でキュー 内のメッセージ滞留状況やチャネルの稼動状態を考慮する必要があります。 例えば、受信側のアプリケーションが障害で停止しても、送信側はリクエスト・メッセージを送り続けることができます。これはMQ のメリットであり、受信側がすぐに復旧すれば処理は続行されますが、長期間普及の見込みがない障害の場合は、リクエスト を停止させる必要があります。そのために、キュー内のメッセージ滞留状況やチャネルの稼動状況の監視を行い、必要に応じて 送信側アプリケーションに通知する運用をします。 MQのキューやチャネルを監視/管理するためには、TivoliやMQ和尚などの監視ツールを導入するか、ユーザ・ア プリケーションを作成します。 監視用アプリケーションの作成は、Base Javaで行います。 滞留しているメッセージ数などキューの状況は、inquireメソッドで取得できます。 また、MQではPCFという管理用のメッセージ・フォーマットが規定されており、PCFメッセージを管理用のキューに 書き込むことによって、キューやチャネルの状況を取得することができます。 (PCFメッセージを扱うのは、Javaインターフェースより、C、COBOLのMQIの方が容易です。) JMSでキューの属性を参照することはできませんし、PCFメッセージを作成したり解読することも可能ですが、困 難であり現実的ではありません。 46 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> 既存アプリケーションとの連携 既存MQアプリケーションで提供するサービスをWebから利用する フロント・エンドのWeb化 既存システムは、MQIで実装されており、変更を加えたくない Base Javaで実装 MQシステム(MQI)との親和性 既存アプリケーションと同じプログラミング手順、デザインが可能 JMSで実装する場合の注意点 既存MQシステムのインターフェース要件の詳細確認が必須 JMSで使用できないMQI機能がある メッセージIDのユーザ設定、セグメンテーション機能、グループ・メッセージ、キューの属性照会 (MQINQ)、BROWSEでのメッセージ待ち受け、コンテキスト情報の利用など VB、独自GUIなど MQI (C、 、COBOL) ) クライアント・アプリケーション 新規システム Web 既存システム CICS/IMSシステムなど MQI (C、 、COBOL) ) アプリケーション・サーバ HTTP サーバ Base-Java JMS クライアント・アプリケーション 47 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> 既存アプリケーションとの連携 <Note> MQはCICSやIMSとの連携を容易に実現できるため、すでにMQIを利用してシステムと連携しているレガシー・ アプリケーションが数多くあります。VBや独自のGUIで書かれているユーザインターフェースをブラウザーにするなど、 これらレガシー・アプリケーションとWebアプリケーションを連携する場合、レガシー・アプリケーションには変更を加え たくはありません。 このようなケースでは、MQIとの親和性の高いBase Javaを採用すれば、既存MQシステムと同様のプログラミン グ手順をとることができ、開発がスムーズに進みます。 JMSを使用する場合は、いくつかの使用できないMQI機能がありますので、事前に既存MQアプリケーションで使 用するMQの機能などインターフェース要件を十分調査しておく必要があります。 48 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> メッセージングによるアプリケーション連携 メッセージングはアプリケーション・レベルの連携 交換するデータ・フォーマットの規定が必要 Webアプリケーションと既存アプリケーション、パッケージ・アプリケーション間のデータ交換 異なるメッセージ・フォーマット JMS、EMSで作成されたWebアプリケーションとMQIで作成された既存アプリケーション 複数宛先を意識 メッセージ・ブローカーによるルーティング/フォーマット変換が有効 異なるデータ・フォーマット間のマッピング JMSメッセージとMQメッセージの構造の違いを吸収 宛先の決定(ルーティング) 異なるトランスポート層を隠蔽 WBI Message Broker 新規システム XMLフォーマット メッセージ・ メッセージ・ブローカー WBIMB ・ルーティング ・フォーマット変換 アプリケーション・サーバ JMS Webサービス MQ SOAP パッケージ・システム SAP,Siebelなど MQ 既存システム CICS/IMSシステムなど 固定長フォーマット MQI (C、COBOL) 49 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> メッセージングによるアプリケーション連携 <Note> メッセージングはアプリケーション・レベルでの連携で、交換するメッセージ・フォーマットを規定する”データ中心”の モデルです。既存のMQアプリケーションやパッケージ・アプリケーションと連携する場合は、それぞれの異なるメッ セージ・フォーマットの変換を、送信側または受信側のアプリケーションで行わなければなりません。また、送信相 手が複数ある場合の宛先をアプリケーションが意識する必要があります。 そこで、メッセージ・ブローカーにフォーマット変換/ルーティング機能を任せれば、各アプリケーションはハブとしてのブ ローカーに接続して自分のフォーマットのメッセージを送るだけで容易に連携が可能になります。 WebSphere Business Integration Message Broker が、メッセージ・ブローカーの実行環境およびEclips ベースのGUIでの開発環境を提供します。 50 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> メッセージング・ミドルウェアの今後 ESB(Enterprise Service Bus) SOAの基盤となる、通信バスの提供 複数の製品、コンポーネントが協調してESB機能を実現 IBMが考えるESBで提供するサービス Mediationサービス トランスポート・サービス ルーティング、変換 イベント・サービス 標準インターフェースのサポート pub/sub 【現行のメッセージング・システム】 EMS JMS プロバイダ JMS 【今後のメッセージング・システム】 MQI JMS JMS プロバイダ MQI 同期/非同期、永続/非永続 BJ JMS WMQ メッセージ ・ブローカー Web サービス JMS プロバイダ JMS ESB リンク JMS プロバイダ BJ Web サービス JMS Webサービス サービスGW、 、 JMSプロバイダ プロバイダ サービス Web サービス JMS JMS JMS Mediation JMS 広義の意味でのESB Copyright ISE Co,.Ltd 51 <MQ-WAS連携-第2章> メッセージング・ミドルウェアの今後 <Note> ESBは、分散システムを構築するためのアプローチであるSOA(Service Oriented Architecture)の通信基盤 です。IBMのBusiness Integration Reference Architecture にも各種サービスを緩やかに連携するための仲 介を行うレイヤーに位置づけられています。 ESBは複数の製品が協調して実現される論理的なバスで、現時点では WebSphere MQ、WBI Message BrokerとWeb Service Gatewayが製品としてマップされます。 IBMは、ESBの機能をより効果的に実現する製品を将来出荷することを開発意向表明しています。 ポータル・サービス SOAP サービス・リクエスト B2Bインタラクション サービス・フロー データ 既存アプリケーション 新規 サービス・ロジック 52 Copyright ISE Co,.Ltd <MQ-WAS連携-第2章> IBMのビジネス統合アーキテクチャ <参考> Business Integration Reference Architecture WebSphere BI Modeler WebSphere Studio Development Platform Business Performance Management Services WBI Monitor Interaction Services WebSphere Portal Server Process Services WebSphere BI Server Information Services DB2 Information Integrator WebSphere BI Server Foundation SOA WebSphere MQ Enterprise Service Bus Web Services Gateway WBI Event/Message Broker Partner Services Business App Services Application and Data Access Services DB2 II Classic WBI Adapters HATS WebSphere BI Connect WebSphere Application Server Business Application and Data Services Enterprise Applications and Data Infrastructure Services 53 Copyright ISE Co,.Ltd