...

メッセージング・インターフェースと利用法 トピック 2004/06/14 IBM WebSphere MQ

by user

on
Category: Documents
98

views

Report

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
Fly UP