mq java インターフェース - ibmpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/......

47
MQ Java MQ Java インターフェース インターフェース ISE Web & Transaction System 20037

Upload: others

Post on 16-Mar-2021

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

MQ Java MQ Java インターフェースインターフェース

ISE Web & Transaction System

2003年7月

Page 2: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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

Page 3: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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サーバ

Page 4: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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固有の機能を追加

Page 5: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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 でサポート

Page 6: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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

ローカル接続

Page 7: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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

Page 8: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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");}

}}

Page 9: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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. キュー・マネージャから切断

<ノート>

Page 10: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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クライアントクライアントクライアントクライアント

Page 11: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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クライアント

Page 12: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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メッセージで、ユーザ指定の要素名で値を取り出せる

Page 13: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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クラスを利用

Page 14: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F 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アプリケーション

Page 15: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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管理コンソール

登録取得

Page 16: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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…..

キュー・セッションの作成

キュー・レシーバーの作成

Page 17: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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);}

}

Page 18: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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. コネクションのクローズ

<ノート>

Page 19: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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クライアント

メッセージ・オブジェクト

Page 20: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.20

<MQ Java インターフェース>

メッセージ受信

トランザクション開始:

DB更新:

メッセージ送信コミット/ロールバック

MDB(続き)

コンテナが起動時にインスタンスを作成し、コネクション、セッションのプールが可能

! WAS管理コンソールから調整可能

トランザクション機能のサポート

! グローバル・トランザクションを自動的に開始させることが可能" コンテナ管理トランザクションとして設定(CMT)" メッセージ受信とビジネスロジック内のリソース更新(DB、メッセージ送信)とを1UOWとして処理できる

" Required を設定" NotSupportedの場合は、トランザクションは引き継がれない

! ディプロイメント・ディスクリプタにトランザクション定義を行なう

【CMT(Required)設定時のUOW】

コンテナがトランザクションを開始

MDBメッセージ受信:

DB更新:

メッセージ送信

MDB

コンテナがトランザクションをコミット/ロールバック

【BMTのUOW】

Page 21: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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

Page 22: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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とリスナー・ポートの紐付け

Page 23: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.23

<MQ Java インターフェース>

キュー・コネクション・ファクトリーの作成

WebSphere JMS MQ Provider 使用時の例! WAS管理コンソールのナビゲーション・ペインから「リソース」→「WebSphere JMS MQ Provider」を選択! 追加プロパティーから「WebSphere MQ キュー接続ファクトリー」を選択し、作成

Page 24: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.24

<MQ Java インターフェース>

キュー・コネクション・ファクトリーの作成(続き)

キュー・マネージャ名を指定

JNDI名を指定キュー・コネクション・ファクトリーの名前を指定

WebSphere管理ドメインにある JMS 接続ファクトリー内で固有でなければいけない

WebSphere MQ JMS プロバイダーの場合、実際のキュー・マネージャーは、別途MQコマンドで作成しておく

WebSphere JMS プロバイダーの場合は、導入時、自動的に作成される

Page 25: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.25

<MQ Java インターフェース>

キュー宛先の作成

! ナビゲーション・ペインから「リソース」→「WebSphere JMS MQ Provider」を選択! 追加プロパティーから「WebSphere MQ キュー宛先」を選択し、作成

Page 26: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.26

<MQ Java インターフェース>

キュー宛先の作成(続き)

キュー名を指定

JNDI名を指定

キュー宛先の名前を指定

WebSphere MQ JMS プロバイダー

の場合、実際のキューはWAS管理コンソールから作成できないので、別途MQコマンドで作成する

WebSphere JMS プロバイダーの場合は、JMSサーバ構成画面からキュー名を指定するとキューが作成できる

Page 27: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.27

<MQ Java インターフェース>

リスナー・ポートの作成

! ナビゲーション・ペインから「サーバー」→「アプリケーション・サーバー」を選択し、コンテンツ・ペインで、アプリケーション・サーバーの名前を選択

! 「追加プロパティー」から「メッセージ・リスナー・サービス」→「リスナー・ポート」を選択

Page 28: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.28

<MQ Java インターフェース>

リスナー・ポートの作成(続き)

リスナー・ポートによって使用されるキュー宛先のJNDI名を指定

リスナー・ポートによって使用されるキュー・コネクション・ファクトリーの

JNDI名を指定

リスナー・ポートの名前を指定

Page 29: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.29

<MQ Java インターフェース>

MDBとリスナー・ポートの紐付けMDBとリスナー・ポートの紐付けは、WSADにて設定! WSADの「J2EE 階層」より、対象のEJBの「EJB デプロイメント・ディスクリプター」を表示! 「Bean」タブを選択し、リスナー・ポートを指定

リスナー・ポートを指定

Page 30: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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}

}

Page 31: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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を作成する場合、上記インタフェースやメソッドは自動的に生成される

<ノート>

Page 32: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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);}

}

Page 33: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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. コネクションのクローズ

<ノート>

メッセージ送信のための処理

Page 34: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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メッセージ・オブジェクトまたは引数として扱える

Page 35: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.35

<MQ Java インターフェース>

Extended Messaging Service(EMS)

メッセージとJavaオブジェクト間のデータマッピング機能を提供! メソッド引数とJMSメッセージの変換を行なう

" アプリケーションは、JMSメッセージ構造を知らなくても良い

トランザクション機能

! 受信側Beanの受信メッセージと送信メッセージを1UOWにすることが可能" コンテナ管理トランザクション(CMT)

Page 36: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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の戻り値から応答メッセージを作成し、オリジナル・メッセージに設定されている宛先に送信する

Page 37: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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(...)

Page 38: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.38

<MQ Java インターフェース>

送信側Beanの開発

メソッド名は自由に設定

応答情報の指定

出力ポートの指定

データ・マッピング機能の利用の有無を指定

メッセージ・フォーマットを識別するためのIDJMSTypeにマッピングされる

Page 39: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.39

<MQ Java インターフェース>

受信側Beanの開発

応答情報の指定

データマッピング機能の利用の有無を指定

メッセージ・フォーマットを識別するためのIDJMSTypeにマッピングされる

MDB内部からコールされるアプリケーションEJBのメソッドの指定

Page 40: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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();

}

Page 41: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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;

・・・

Page 42: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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();}

}

Page 43: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

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();}

}

Page 44: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.44

<MQ Java インターフェース>

ポートの作成

Page 45: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.45

<MQ Java インターフェース>

出力ポートの作成

Page 46: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base Java!

Copyright ISE Co,.Ltd.46

<MQ Java インターフェース>

入力ポートの作成

Page 47: MQ Java インターフェース - IBMpublic.dhe.ibm.com/software/dw/jp/websphere/wmq/java_ws/... IBM WebSphere MQ のJava I/F MQ Base 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のバージョンは、プラットフォームによって若干異なる