JMS/ Introduction to JMS

JMS
通称「MOM」(メッセージ指向ミドルウェア)
と呼ばれるエンタープライズメッセージングシステムにアクセスするための標準API
つまり
MOMのサービスを利用するための ベンダ・ニュートラルの Javaベースの標準インターフェイス群

JMSの特徴
* Javaアプリケーション間で既存のMOMを共有し メッセージを送受信できる
* メッセージを作成 送受信するための標準インターフェイスで メッセージ・アプリケーションの開発が容易になる
* 既存のMOM製品群を横断的にカバーするアーキテクチャで メッセージング・アプリケーションのポータビリティが向上する


JMSのメッセージングモデル
MOM製品の主要なメッセージングモデル:
*ポイント・ツー・ポイント(PTP)
*パブリッシュ/サブスクライブ(Pub/Sub)
PTP
1つのあて先に対して1つの送信元からメッセージが送信される
Pub/Sub
階層化されたノードに定義された複数のクライアントに1つの送信元からメッセージを配信する


■PTPメッセージングモデル
名前付きキューを使用してメッセージが送受信される
キューセンダ(プロデューサ)は
特定のキューに対してメッセージを送信し キューレシーバ(コンシューマ)は
特定のキューからメッセージを受信する

複数のキューセンダおよびキューレシーバを1つのキューに関連付けられるが
個々のメッセージは1つのキューレシーバにしか配信できない

■Pub/Subメッセージングモデル
トピックをサブスクライブすることでメッセージが送受信される
トピックパブリッシャ(プロデューサ)は
特定のトピックに対してメッセージを送信する
トピック・サブスクライバ(コンシューマ)は
特定のトピックからメッセージが受信される

複数のトピックサブスクライバが同じメッセージを受信でき
メッセージは
すべてのトピックサブスクライバが受信するまで維持される


JMSのアーキテクチャ
JMSクライアント:
メッセージを送受信する個々のJavaプログラム
メッセージ・プロデューサ=メッセージ送信側
メッセージ・コンシューマ=メッセージ受信側
JMSプロバイダ:
JMSインターフェイスを実装し
かつ管理機能なども装備したメッセージングシステムそのもの
もしくはMOMのサービスをJ2EE側に提供する実装
JMSメッセージ:
JMSクライアント間で情報の受け渡すための個々のアプリケーションで定義されるリクエスト/レポート/イベント


プラス
ベンダニュートラルのため
メッセージ通信に関する属性定義は
オブジェクトとしてカプセル化されて管理される

管理オブジェクト
JNDIに登録されるオブジェクト
JMSクライアントがルックアップすることでJMSのサービスを利用できる
管理オブジェクトは
JMSクライアントがJMSプロバイダに接続するために必要な属性情報を管理する


ConnectionFactoryオブジェクト
管理オブジェクトの1つ
JMS管理者によって定義された属性情報(JMSプロバイダが存在するホスト名、ポート番号、接続するクライアントIDなど)の集合をカプセル化する
JMSクライアントは
ConnectionFactoryオブジェクトを利用してJMSプロバイダとの接続を確立する
ConnectionFactoryインターフェイスは、JMSクライアントがConnectionを作成できるようにする


Destinationオブジェクト
管理オブジェクトの1つ
既存のMOM製品が持つ固有の属性をカプセル化する
javax.jms.Destinationインターフェイスのサブクラスとして
javax.jms.Queue
javax.jms.Topic
等がある


Connectionオブジェクト
JMSクライアントとJMSプロバイダの接続状態を管理する
JMSアプリとメッセージングシステム間の通信チャネルを表していて
メッセージを生成し送受信するためのSessionオブジェクトを作成するために使用される
Connectionオブジェクトには
PTPとPub/Subに対応する
javax.jms.QueueConnection
javax.jms.TopicConnection
がある


Sessionオブジェクト
生成および送受信されるメッセージの順序を定義し
複数のMessageProducerとMessageConsumerを作成できる


MessageProducer/MessageConsumerオブジェクト
MessageProducerオブジェクト:
メッセージをQueue/Topicに送信する
MessageConsumerオブジェクト:
メッセージがQueue/Topicから受信する
2つのオブジェクトは互いに独立して機能する


メッセージセンダオブジェクト&メッセージレシーバオブジェクト
MessageProducerクラスおよびMessageConsumerクラスのサブクラスとして作成される


■JMSのメッセージ
Messageオブジェクト
アプリケーション間で交換される情報がカプセル化されており
標準のメッセージヘッダフィールド
アプリケーション固有のプロパティ
メッセージ本文
という3つの要素で構成される

メッセージヘッダフィールド
JMSメッセージにデフォルトで挿入される MessageConsumerで利用できる標準のヘッダフィールド
MessageProducerからも設定できる

メッセージプロパティフィールド
メッセージプロデューサによって追加されたヘッダフィールド
標準的なJavaの名前と値の組み合わせでなる
メッセージ本文
プロデューサからコンシューマに配信される内容


JMSアプリケーションの開発手順
1. 必要なパッケージのインポート
2. JMSアプリケーションの設定
3. メッセージの送信、受信、および確認応答
4. リソースのクローズとリリース

■JMSアプリケーションの設定(Pub/Subアプリの場合)

/* 必要な変数(JNDIコンテキストなど)、JMS接続ファクトリ、およびトピック静的変数を定義 */
public final static String JNDI_FACTORY = "javax.jndi.InitialContextFactory";
public final static String JMS_FACTORY = "javax.jms.TopicConnectionFactory";
public final static String TOPIC = "javax.jms.Topic";

protected TopicConnectionFactory tconFactory;
protected TopicConnection tcon;
protected TopicSession tsession;
protected TopicPublisher tpublisher;
protected Topic topic;
protected TextMessage msg;

InitialContext ic = getInitialContext(args[0]); /* JNDI 初期コンテキストを設定 */

private static InitialContext getInitialContext(String url) throws NamingException{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, url);
return new InitialContext(env);
}

/* JMSトピックにメッセージを送信するために必要なすべてのオブジェクトを作成 */
public void init(Context ctx/* JNDI 初期コンテキスト */, String topicName) throws NamingException, JMSException{
tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY); /*JNDIを使用してConnectionFactoryをルックアップ */
tcon = tconFactory.createTopicConnection(); /*ConnectionFactoryを使用してConnectionを作成 */
tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); /*Connectionを使用してSession(この場合は非トランザクション)を作成 */

topic = (Topic) ctx.lookup(topicName); /*JNDIを使用してDestination(Topic)をルックアップ */
tpublisher = tsession.createPublisher(topic); /*SessionとDestination(Topic)を使用してメッセージセンダオブジェクト(TopicPublisher)への参照を作成 */
msg = tsession.createTextMessage(); /* メッセージオブジェクトを作成 */
tcon.start(); /* 接続を開始 */
}

■メッセージの送信(Pub/Subアプリの場合)

msg = tsession.createTextMessage();

public void send(String message) throws JMSException{
msg.setText(message);
tpublisher.publish(msg); /* トピックパブリシャ・オブジェクトのPublishメソッドで送信 */
}

■メッセージの受信
メッセージを受信するには
メッセージレシーバオブジェクトを作成し
メッセージを同期受信するか非同期受信するかを指定する必要がある

□メッセージの非同期受信
tsubscriber = tsession.createSubscriber(topic); /* トピックサブスクライバを作成 */
tsubscriber.setMessageListener(msgListener); /* 非同期メッセージリスナを登録 */
*msgListener
public void onMessage(Message msg){
try {
String msgText = null;
if (msg instanceof TextMessage) {
msgText = ((TextMessage)msg).getText();
}else { // TextMessageではない場合
msgText = msg.toString();
}
System.out.println("Message Received:"+ msgText );
if (msgText.equalsIgnoreCase("quit")) {
synchronized(this) {
quit = true;
this.notifyAll(); // メインスレッドに終了するよう通知する
}
}
} catch (JMSException jmse) {
jmse.printStackTrace();
}
}

□メッセージの同期受信
メッセージを同期的に受信するには
recieveメソッドを使用する
receiveメソッドを引数なしで呼び出した場合
メッセージが生成されるか
または
アプリケーションが閉じられるまで無期限にその呼び出しが ブロックされる
代わりに
タイムアウト値を渡してメッセージの待ち時間を指定することも可

tsubscriber = tsession.createSubscriber(topic); /* Topicに対するトピックサブスクライバの作成 */
Message msg = tsubscriber.receive(); /* メッセージ受信まで無期限にメッセージ待機 */
msg.acknowledge();


ref:
Javaを紐解くための重点キーワード:JMS, 2001/11/7
http://www.atmarkit.co.jp/fjava/keyword/jkey/jkey06.html

tag : JMS

2009-10-21 00:24 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WMQ/ mq.jar & mqjms.jar

Locate the file com.ibm.mqjms.jar and com.ibm.mq.jar on the file system:

for Windows: \java\lib
for Linux/Unix: /opt/mqm/java/lib

is where MQ Embedded messaging client and server is installed for example:
C:\IBM\WebSphereMQ or C:\IBM\WebSphere\AppServer\MQ

ref:
http://www-01.ibm.com/support/docview.wss?rs=0&q1=1174559&uid=swg21174559&loc=en_US&cs=utf-8&cc=us&lang=en

tag : WebSphere MQ JMS

2009-08-17 04:20 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WMQ/ Introduction

■Abs
多種なシステムを緩やかに接合するための通信ミドルウェア。

WMQが持つJavaプログラミングIF:
WMQ独自のJavaプログラミングIFであるMQ Base Java
―J2EEのJMS

アプリとQueueManagerの接続方法:
―アプリが、同一システム上で稼動するQMgrと直接接続するbinding接続
―アプリが、ネットワーク経由してQMgrと接続するクライアント接続
いずれの接続方法でも
MQ Base JavaとJMSを利用できる。


■MQ Base Java
WebSphere MQ独自のJavaプログラミングIF。
→MQIが実装しているメッセージ処理機能の殆どを
 Javaアプリから利用できる。

□プログラムの流れ
①必要なパッケージのimport
 java.io.*のimport
 com.ibm.mq.jarのimport
 (@/opt/mqm/java/lib, {WebSphereHome}/java/lib)
 +αのimport/CLASSPATHへのディレクトリ追加
②環境設定
 どのホスト上のどのQmgrに接続するか
 をMQEnvironment(@com.ibm.mq.jar)のstatic変数に設定
 hostname, channel, port, CCSiD
③キューマネージャとの接続
 MQQueueManagerクラスのconstructer呼び出しでQMgrと接続される
 生成されたinstanceが、
 MQIのMQCONNで得られる接続ハンドルに相当する。
④キューのオープン
 MQQueueクラスのinstance生成
 方法は2つ
  constructerで生成
  MQQueue q = new MQQueue(
    qMgr,
    "qName",
    pmo/*MQI#MQPUT, MQGET, MQSET, MQINQ*/,
    null/*qMgrName*/,
    null/*dynamicQName*/,
    null/*userId*/);
  qMgr.accessQueue()で取得
  MQQueue q = qMgr.accessQueue(
    "qName",
    pmo/*MQI#MQPUT, MQGET, MQSET, MQINQ*/,
    null/*qMgrName*/,
    null/*dynamicQName*/,
    null/*userId*/);
 キューインスタンスが、
 MQIのMQOPENで得られるオブジェクト・ハンドルに相当する。
⑤各種パラメータの設定
 MQIでいうMQPMO/MQGMO構造体に当たる
 MQPut/GetMessageOptionsへの必要なparameter設定
 MQPutMessageOptions pmo = new MQPutMessageOptions();
 pmo.Options = parameter setting..
 MQGetMessageOptions gmo = new MQGetMessageOptions();
 gmo.Options = parameter setting..
 WebSphereMQでのメッセージは、
 メッセージの属性、宛先情報を保持するヘッダ部分と
 ユーザデータ部分から成る2層構造をとる。
 MQ Base Javaでは、
 MQMessageがこれら情報の入れ物になる。
 MQMessage msg = new MQMessage();
 ヘッダ部分に設定する情報は、
 MQMessageクラスの各変数に設定される。
 msg.messageType = MQC.MQMT_DATARAM;
 msg.characterSet = 932;//msgに含まれるデータCCSID
 msg.format = MQC.MQFMT_STRING;//ユーザデータ型
 msg.persistence = MQC.MQPER_PERSISTENT;//パーシスタント・メッセージ
 MSGをキューに書き込む場合
 MQMessageインスタンスのユーザデータ部分に
 任意の情報を格納する。
 msg.writeString("hogepiyo");
 *Unicodeを扱う場合:writeChar()/wirteChars()
 *Javaオブジェクトを扱う場合:wirteObject()
⑥メッセージお送受信
 *キューへの書き込み
  q.put(msg, pmo);
 *キューからの読み取り
  gmoインスタンスの生成、必要なparameterの設定
  msgインスタンスの生成、必要なparameterの設定
  ユーザデータを格納するbufferの準備
  をして
  q.get(msg, gmo);
  ユーザデータの読み出しは、データタイプに依存する。
  *readLine():
   MQMessage.CCSIDで指定されたCCSIDから
   Unicodeへデータ変換し、
   1行分の文字列を指定されたbufferにコピーする。
   String msgContent = null;
   msg.readLine(msgContent);
  *readChar():Unicode用
  *readLine():Unicodeに変換し
   指定された長さ分の文字列を読み込む
  *readObject:Javaオブジェクト用
⑦キューのクローズ
 q.close();
⑧キューマネージャからの切断
 qMgr.disconnect();

□エラー処理
MQ Base Javaの各メソッドは、
MQIのように理由コードや完了コードをアプリに返さない。
異常終了時は完了コードをMQExceptionでアプリに通知する。
→アプリは、try/catchでエラー処理が出来る。
try {
 q.put( msg1, pmo1 );
 q.put( msg2, pmo2 );
 q.put( msg3, pmo3 );
} catch( MQException mqe ) {
 System.out.println(" 問題発生/理由: " + mqe.reasonCode + "/ 状態: " + mqe.completionCode );
 q.close();
 qMgr.disconnect();
}

□マルチスレッド対応
MQ Base Javaでは、
MQQueueManagerオブジェクトやMQQueueオブジェクトを、
複数スレッドで共有できる。
ただし、
WebSphere MQ関連のメソッドが"synchronized"されているため、
あるスレッドで呼び出されたWebSphere MQ関連のメソッドの処理中は、
他のスレッドは処理を待たされる。
待たせたくない場合は、スレッド毎にqMgrオブジェクトやqオブジェクトを生成する。


JMS
□プログラムの流れ
①必要なパッケージのimport
 WebSphere MQを使ったJMSアプリには以下jarが必要
 com.ibm.mq.jar(jms.jarでも可)
 更に、
 ConnectionFactoryをJNDIネームスペースから取得する場合、
 jndi.jar等も必要
 import javax.jms.*;
 import javax.naming.*;
 ※ConnectionFactoryをアプリ実行時に生成する場合は、
  com.ibm.mq.jms.jarが必要。
②ConnectionFactoryの取得
 ConnectionFactoryは、
 JMSClient(JMSアプリ)とJMSProvider(WMQ etc)とを
 接続させるために必要な情報。
 この際、
 JNDI等で、
 予め登録済みの各種情報にアクセスする。
 (WMQのMQEnvironmentの設定に相当)
 //InitialContextFactoryの生成
 java.util.Hashtable env = new Hashtable();
 env.put(Context.INITIAL_CONTEXT_FACTORY, icf);
 env.put(Context.PROVIDER_URL, url);
 Context ctx = new InitialContext(env);
 //ConnectionFactoryの取得
 ConnectionFactory factory;
 factory = (ConnectionFactory)ctx.lookup(...);
③Destinationの取得
 Destinationとは、
 メッセージの送信先/取り出し元のオブジェクト(キュー)。
 予めネームスペースにその実体や名前や各種属性を登録しておき、
 JMSClientがlookupすることで
 Destinationを取得する。
 ※実体はQueueかTopic
 Queue q;
 q = (Queue) ctx.lookup(hogeQueue);
④Connectionの生成
 qMgrに接続するための環境設定と
 Connectionオブジェクトの生成
 //ConnectionFacotryからConnectionを生成
 Connection con = factory.createConnection();
 //生成したConnectionはまだ停止状態
 ※このConnectionオブジェクトは
  JMSClientとJMSProviderとの
  networkLevelの接続的イメージ
⑤Sessionの生成
 ConnectionオブジェクトからSessionオブジェクトの生成
 Sesseion session = con.createSession(
  transactionFlag/*同期点処理するかの指定*/,
  Session.AUTO_ACKNOWLEDGE/*省略値*/
  );
⑥MessageProducerの生成 / ⑨MessageConsumerの生成
 ⑥MessageProducer msgSender;
  msgSender = session.createProducer( myQueue );
  connection.start();
 ⑨MessageConsumer msgReceiver;
  msgReceiver = session.createConsumer( myQueue );
  connection.start();
⑦Messageの生成 / ⑩Messageの受信
 ⑦String msgContent = "contents";
  TextMessage msg;
  msg = session.createTextMessage( );
  msg.setText( msgContent );
 ⑩long waitInteral = 3000; // メッセージ受信待ち時間(msec)
  Message receivedMsg = msgReceiver.receive(waitInterval);
⑧Messageの送信 / ⑪メッセージタイプの確認と処理
 ⑧mySender.send( msg );
 ⑪if( receivedMsg instanceof TextMessage ){
   // TextMessage処理
   String userData = ( (TextMessage)receivedMsg ).getText( );
   .......
  }else if( receivedMsg instanceof MapMessage ){
   // MapMessage処理
  }else if...
⑫オブジェクトのクローズ
 msgSender/msgReceiver.close();
 session.close();
 connection.stop();
 connection.close();


■MQ Base Java & JMS
MQ Base JavaはMQIをJavaへ移植したAPI
JMSはJ2EE標準におとづくAPI

MQ Base Javaは 通常のMQIで出来る殆どの操作が可能
JMSは 通常のMQIで出来る操作が可能とは限らない
MQ Base Javaは
MQMD.MsgIdの指定が可能
メッセージのSegmentatin/Groupingが可能

→MQ Base Javaが優位

JMSは
MessageSelectorをサポート
Pub/Sub機能をサポート
非同期リスナをサポート
する
→JMSが優位

□JMS/ MessageSelector
MQ Base JavaはMsgIdとCorrelIdのみが判断材料なのに対し、
MessageSelectorはプロパティをも判定材料とできる。

// 検索条件の設定(Message Selectorの生成)
String msgSelector = "(Weather = Rain) or (Weather = Typhoon)";
MessageConsumer msgReceiver;
// myQueueは、先に取得済み(Queueオブジェクト)
msgReceiver = session.createConsumer( myQueue, msgSelector );
// この後メッセージ受信を開始すると、プロパティーの"Weather"が
// "Rain"か"Typhoon"という値になっているメッセージだけを
// このアプリケーションは読み出すことになる.


■選択
1つアプリでMQ Base JavaとJMSの両方を使うことは不可。
→どちらかを選択する。



ref:
http://download.boulder.ibm.com/ibmdl/pub/software/dw/jp/websphere/wmq/mq_intro/9.pdf

tag : WMQ WebSphere JMS

2009-06-16 22:13 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

JMS/ Message Property Names

■message.getPropertyNames()
□WMQ
JMSXAppID
JMSXUserID
JMS_IBM_Encoding
JMS_IBM_MsgType
JMSXDeliveryCount
JMS_IBM_PutTime
JMS_IBM_Format
JMS_IBM_PutApplType
JMS_IBM_PutDate
JMS_IBM_Character_Set

tag : JMS

2009-06-11 22:43 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WMQ/ Thin Client

■protocol
○TCP
○SSL
×HTTP

■jars
com.ibm.ws.sib.client.thin.jms_7.0.0.jar : 通常の JMS クライアント
com.ibm.ws.sib.client_ExpeditorDRE_7.0.0.jar : Lotus Expeditor 用にパッケージされた JMS クライアント
sibc.nls.zip : 言語固有のリソース・バンドル
@%WAS_HOME%/runtimes



ref:
JMS クライアントの開発 (source sample)
http://publib.boulder.ibm.com/infocenter/wasinfo/v5r0/index.jsp?topic=/com.ibm.websphere.base.doc/info/aes/ae/tmj_devcl.html
Thin Client for JMS (WebSphere Application Serverのインストールおよび構成
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.pmc.express.doc/tasks/tjj_jmsthcli_dev.html
Thin Client for JMS (WebSphere Application Serverによる JMS リソースの使用
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.pmc.express.doc/tasks/tjj_jmsthcli_dev.html

tag : WebSphere JMS

2009-06-05 00:00 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WMQ/ Introduction to messaging from WMQ

■Messaging
□what is a message?
in message queueing, a message is simply a collection of data sent by one program and intended for another program.
WebSphere MQ primarily defines four types of message:
1. Datagram: a simple message for which no reply is expected
2. Request: a message for which a reply is expected
3. Reply: a reply to request message
4: Report: a message that describes an event such as the occurence of an error.

※ this article focuses on type 2 and 3 only.

□message descriptor
a message consists of control information and application data.
the control information is defined in a message descriptor structure (MQMD) and contains things like:
- the type of the message
- an identifier for the message
- the priority for delivery of the message.
the data is determined by the participating programs, not MQ.

□what is a message queue?
a message queue is a named destination to which messages can be sent.
queues are managed by a queue manager.
the physical management of queues is the responsibility of the queue namager and is not made apparent to the participating application programs.
programs access queues only through queue manager.

□what is a queue manager?
a queue manager is a system program that provides queuing services to applications.
it exposes an API that would allow programs to put and get messages from queues.
a queue manager provides additional functions that would provide administrators with the ability to create new queues, alter the properties of existing ones, and control the operation of the queue manager.

□Messages
there are four types of mesage defined by WebSphere MQ:
- datagram
- request
- reply
- report
applications can use the first three types of messages to pass information b/w themselves.
the fourth type, report, is for applications and queue managers to report information about events such as the occurrence of an error.

*Datagram messages
you should use a datagram when you do not require a reply from the application that receives the message.

*Request messages
you should use a request message when you expect a reply from the application that receives the message.
if you want to link your reply message with your request message, there are two options:
option1:
you can give the application that handles the request message the responsibility of ensuring that it puts information into the reply message that relates to the request message.
option2:
you can use the report field in the message descriptor of your request message to specify the content of the MsdId and CorrelId fields of the reply message:
you can request that either the MsgId or the CorrelId of the original message is that the MsgId of the original message is to be copied into the MsgId field of the reply message.
(the default action is to generate a new message identifier.)

*Reply messages
you should use a reply message when you reply to another message.
when you create a reply message, you should respect any options that were set in the message descriptor of the message to which you are replying.
report options specify the content of the message identifier (MsgId) and correlation identifier (CorrelId) fields.
these fields allow the application that receives the reply to correlate the reply with its original request .

*Report messages
report messages inform applications about events such as the occurence of an error when processing a message.
they can be gerenated by a queue manager, a message channel agent, or an application.
note that report messages can be generated at any time, and they may arrive on a queue when your application is not expecting them.

*correlating replies
in websphere MQ applications, when a program receives a message that asks it to do some work, the program usually sends one or more reply messages to the requester.
to help the requester to associate these replies with its original request, an application can set a correlation identifier field in the descriptor of each message.
programs should copy the message identifier of the request message into the correlation identifier field of their reply messages.

□Channels
a channel is a communication link used by queue managers.
there are two categories of channel in WebSphere MQ, and we can describe them as control channels and data channels:
*message channels, which are unidirectional, and trasfer messages from one queue manager to another.
*message queue interface (MQI) channels, which are bidirectional, and transfer control calls from a WebSphere MQ client to a queue manager, and responses from a queue manager to a WebSphere MQ client.


WebSphere MQ Object Model
WMQ provides the following set of classes:
*MQQueueManager
*MQQueue
*MQMessage
*MQPutMessageOptions
*MQGetMessageOptions


■WebSphere MQ Client
a websphere MQ client is part of the websphere mq product that can be installed on a separate machine from the base product and server and acts as a proxy b/w that machine and the server.
you can run a websphere MQ application on a websphere MQ client and it can interact with one or more websphere MQ servers and connect to their queue managers by means of a communications protocol.

the MQI is available to applications running on the client platform; the queues and other websphere MQ objects are held on a queue manager that you have installed on a server machine.
an application that you want to run in the websphere mq client environment must first be linked with the relevant client library.
when the application issues an MQI call, the websphere MQ client directs the request to a queue manager, where it is processed and from where a reply is sent back to the websphere mq client.

□how the client connects to the server
an applicationrunning in the websphere mq client environment runs in synchronous mode because there must be an active connection b/w the client and the server machines.
the connection is made by an application issuing an MQCONN or MQCONNX calls.
clients and server communicate through MQI channels.
when the call succeeds, the MQI channel remains connected until the application issues a MQDISC call.
this is the case for every queue manager that an application needs to connect to.

□why use websphere mq clients?
using websphere MQ clients is an efficient way of implementing WebShpere MQ messaging and queuing.

you can have an application that uses the MQI running on one machine and the queue manager running on a different machine.
the benefits of doing this are:
- there is no need for a full WebSphere MQ implementation on the client machine; for example, it could be a DOS, Windows 3.1, 95, 98, XP.
- hardware requirements on the client system are reduced.
- system administration requirements are reduced.
- a WebSphere MQ application running on a client can connect to multiple queue managers on different systems.



■Queue Accessing Optons
MQOO_INPUT_AS_Q_DEF: Open to get messages using queue-defined default.
MQOO_INPUT_SHARED: Open to get messages with shared access.
MQOO_INPUT_EXCLUSIVE: Open to get messages with exclusive access.
MQOO_BROWSE: Open to browse message.
MQOO_OUTPUT: Open to put messages.
MQOO_INQUIRE: Open for inquiry, required if you wish to query properties.
MQOO_SET: Open to set attributes, required if you wish to set properties.
MQOO_BIND_ON_OPEN: Bind handle to destination when queue is opened.
MQOO_BIND_NOT_FIXED: Do not bind to a specific destination.
MQOO_BIND_AS_Q_DEF: Use default binding for queue.
MQOO_SAVE_ALL_CONTEXT: Save context when message retrieved.
MQOO_PASS_IDENTITY_CONTEXT: Allow identity context to be passed.
MQOO_PASS_ALL_CONTEXT: Allow all contexts to be passed.
MQOO_SET_IDENTITY_CONTEXT: Allows identity context to be set.
MQOO_SET_ALL_CONTEXT: Allows all contexts to be set.
MQOO_ALTERNATE_USER_AUTHORITY: Validate with the specified user identifier.
MQOO_FAIL_IF_QUIESCING: ail if the queue manager is quiescing.

■Error & Reason Codes (MQException.MQRC_{ERROR_REASON_CODE})
[0000] MQRC_NONE
[0900] MQRC_APPL_FIRST
[0999] MQRC_APPL_LAST
[2001] MQRC_ALIAS_BASE_Q_TYPE_ERROR
[2002] MQRC_ALREADY_CONNECTED
[2003] MQRC_BACKED_OUT
[2004] MQRC_BUFFER_ERROR
[2005] MQRC_BUFFER_LENGTH_ERROR
[2006] MQRC_CHAR_ATTR_LENGTH_ERROR
[2007] MQRC_CHAR_ATTRS_ERROR
[2008] MQRC_CHAR_ATTRS_TOO_SHORT
[2009] MQRC_CONNECTION_BROKEN
[2010] MQRC_DATA_LENGTH_ERROR
[2011] MQRC_DYNAMIC_Q_NAME_ERROR
[2012] MQRC_ENVIRONMENT_ERROR
[2013] MQRC_EXPIRY_ERROR
[2014] MQRC_FEEDBACK_ERROR
[2016] MQRC_GET_INHIBITED
[2017] MQRC_HANDLE_NOT_AVAILABLE
[2018] MQRC_HCONN_ERROR
[2019] MQRC_HOBJ_ERROR
[2020] MQRC_INHIBIT_VALUE_ERROR
[2021] MQRC_INT_ATTR_COUNT_ERROR
[2022] MQRC_INT_ATTR_COUNT_TOO_SMALL
[2023] MQRC_INT_ATTRS_ARRAY_ERROR
[2024] MQRC_SYNCPOINT_LIMIT_REACHED
[2025] MQRC_MAX_CONNS_LIMIT_REACHED
[2026] MQRC_MD_ERROR
[2027] MQRC_MISSING_REPLY_TO_Q
[2029] MQRC_MSG_TYPE_ERROR
[2030] MQRC_MSG_TOO_BIG_FOR_Q
[2031] MQRC_MSG_TOO_BIG_FOR_Q_MGR
[2033] MQRC_NO_MSG_AVAILABLE
[2034] MQRC_NO_MSG_UNDER_CURSOR
[2035] MQRC_NOT_AUTHORIZED
[2036] MQRC_NOT_OPEN_FOR_BROWSE
[2037] MQRC_NOT_OPEN_FOR_INPUT
[2038] MQRC_NOT_OPEN_FOR_INQUIRE
[2039] MQRC_NOT_OPEN_FOR_OUTPUT
[2040] MQRC_NOT_OPEN_FOR_SET
[2041] MQRC_OBJECT_CHANGED
[2042] MQRC_OBJECT_IN_USE
[2043] MQRC_OBJECT_TYPE_ERROR
[2044] MQRC_OD_ERROR
[2045] MQRC_OPTION_NOT_VALID_FOR_TYPE
[2046] MQRC_OPTIONS_ERROR
[2047] MQRC_PERSISTENCE_ERROR
[2048] MQRC_PERSISTENT_NOT_ALLOWED
[2049] MQRC_PRIORITY_EXCEEDS_MAXIMUM
[2050] MQRC_PRIORITY_ERROR
[2051] MQRC_PUT_INHIBITED
[2052] MQRC_Q_DELETED
[2053] MQRC_Q_FULL
[2055] MQRC_Q_NOT_EMPTY
[2056] MQRC_Q_SPACE_NOT_AVAILABLE
[2057] MQRC_Q_TYPE_ERROR
[2058] MQRC_Q_MGR_NAME_ERROR
[2059] MQRC_Q_MGR_NOT_AVAILABLE
[2061] MQRC_REPORT_OPTIONS_ERROR
[2062] MQRC_SECOND_MARK_NOT_ALLOWED
[2063] MQRC_SECURITY_ERROR
[2065] MQRC_SELECTOR_COUNT_ERROR
[2066] MQRC_SELECTOR_LIMIT_EXCEEDED
[2067] MQRC_SELECTOR_ERROR
[2068] MQRC_SELECTOR_NOT_FOR_TYPE
[2069] MQRC_SIGNAL_OUTSTANDING
[2070] MQRC_SIGNAL_REQUEST_ACCEPTED
[2071] MQRC_STORAGE_NOT_AVAILABLE
[2072] MQRC_SYNCPOINT_NOT_AVAILABLE
[2075] MQRC_TRIGGER_CONTROL_ERROR
[2076] MQRC_TRIGGER_DEPTH_ERROR
[2077] MQRC_TRIGGER_MSG_PRIORITY_ERR
[2078] MQRC_TRIGGER_TYPE_ERROR
[2079] MQRC_TRUNCATED_MSG_ACCEPTED
[2080] MQRC_TRUNCATED_MSG_FAILED
[2082] MQRC_UNKNOWN_ALIAS_BASE_Q
[2085] MQRC_UNKNOWN_OBJECT_NAME
[2086] MQRC_UNKNOWN_OBJECT_Q_MGR
[2087] MQRC_UNKNOWN_REMOTE_Q_MGR
[2090] MQRC_WAIT_INTERVAL_ERROR
[2091] MQRC_XMIT_Q_TYPE_ERROR
[2092] MQRC_XMIT_Q_USAGE_ERROR
[2093] MQRC_NOT_OPEN_FOR_PASS_ALL
[2094] MQRC_NOT_OPEN_FOR_PASS_IDENT
[2095] MQRC_NOT_OPEN_FOR_SET_ALL
[2096] MQRC_NOT_OPEN_FOR_SET_IDENT
[2097] MQRC_CONTEXT_HANDLE_ERROR
[2098] MQRC_CONTEXT_NOT_AVAILABLE
[2099] MQRC_SIGNAL1_ERROR
[2100] MQRC_OBJECT_ALREADY_EXISTS
[2101] MQRC_OBJECT_DAMAGED
[2102] MQRC_RESOURCE_PROBLEM
[2103] MQRC_ANOTHER_Q_MGR_CONNECTED
[2104] MQRC_UNKNOWN_REPORT_OPTION
[2105] MQRC_STORAGE_CLASS_ERROR
[2106] MQRC_COD_NOT_VALID_FOR_XCF_Q
[2109] MQRC_SUPPRESSED_BY_EXIT
[2110] MQRC_FORMAT_ERROR
[2111] MQRC_SOURCE_CCSID_ERROR
[2112] MQRC_SOURCE_INTEGER_ENC_ERROR
[2113] MQRC_SOURCE_DECIMAL_ENC_ERROR
[2114] MQRC_SOURCE_FLOAT_ENC_ERROR
[2115] MQRC_TARGET_CCSID_ERROR
[2116] MQRC_TARGET_INTEGER_ENC_ERROR
[2117] MQRC_TARGET_DECIMAL_ENC_ERROR
[2118] MQRC_TARGET_FLOAT_ENC_ERROR
[2119] MQRC_NOT_CONVERTED
[2120] MQRC_CONVERTED_MSG_TOO_BIG
[2120] MQRC_TRUNCATED
[2121] MQRC_NO_EXTERNAL_PARTICIPANTS
[2122] MQRC_PARTICIPANT_NOT_AVAILABLE
[2123] MQRC_OUTCOME_MIXED
[2124] MQRC_OUTCOME_PENDING
[2125] MQRC_BRIDGE_STARTED
[2126] MQRC_BRIDGE_STOPPED
[2127] MQRC_ADAPTER_STORAGE_SHORTAGE
[2128] MQRC_UOW_IN_PROGRESS
[2129] MQRC_ADAPTER_CONN_LOAD_ERROR
[2130] MQRC_ADAPTER_SERV_LOAD_ERROR
[2131] MQRC_ADAPTER_DEFS_ERROR
[2132] MQRC_ADAPTER_DEFS_LOAD_ERROR
[2133] MQRC_ADAPTER_CONV_LOAD_ERROR
[2134] MQRC_BO_ERROR
[2135] MQRC_DH_ERROR
[2136] MQRC_MULTIPLE_REASONS
[2137] MQRC_OPEN_FAILED
[2138] MQRC_ADAPTER_DISC_LOAD_ERROR
[2139] MQRC_CNO_ERROR
[2140] MQRC_CICS_WAIT_FAILED
[2141] MQRC_DLH_ERROR
[2142] MQRC_HEADER_ERROR
[2143] MQRC_SOURCE_LENGTH_ERROR
[2144] MQRC_TARGET_LENGTH_ERROR
[2145] MQRC_SOURCE_BUFFER_ERROR
[2146] MQRC_TARGET_BUFFER_ERROR
[2148] MQRC_IIH_ERROR
[2149] MQRC_PCF_ERROR
[2150] MQRC_DBCS_ERROR
[2152] MQRC_OBJECT_NAME_ERROR
[2153] MQRC_OBJECT_Q_MGR_NAME_ERROR
[2154] MQRC_RECS_PRESENT_ERROR
[2155] MQRC_OBJECT_RECORDS_ERROR
[2156] MQRC_RESPONSE_RECORDS_ERROR
[2157] MQRC_ASID_MISMATCH
[2158] MQRC_PMO_RECORD_FLAGS_ERROR
[2159] MQRC_PUT_MSG_RECORDS_ERROR
[2160] MQRC_CONN_ID_IN_USE
[2161] MQRC_Q_MGR_QUIESCING
[2162] MQRC_Q_MGR_STOPPING
[2163] MQRC_DUPLICATE_RECOV_COORD
[2173] MQRC_PMO_ERROR
[2182] MQRC_API_EXIT_NOT_FOUND
[2183] MQRC_API_EXIT_LOAD_ERROR
[2184] MQRC_REMOTE_Q_NAME_ERROR
[2185] MQRC_INCONSISTENT_PERSISTENCE
[2186] MQRC_GMO_ERROR
[2187] MQRC_CICS_BRIDGE_RESTRICTION
[2188] MQRC_STOPPED_BY_CLUSTER_EXIT
[2189] MQRC_CLUSTER_RESOLUTION_ERROR
[2190] MQRC_CONVERTED_STRING_TOO_BIG
[2191] MQRC_TMC_ERROR
[2192] MQRC_PAGESET_FULL
[2192] MQRC_STORAGE_MEDIUM_FULL
[2193] MQRC_PAGESET_ERROR
[2194] MQRC_NAME_NOT_VALID_FOR_TYPE
[2195] MQRC_UNEXPECTED_ERROR
[2196] MQRC_UNKNOWN_XMIT_Q
[2197] MQRC_UNKNOWN_DEF_XMIT_Q
[2198] MQRC_DEF_XMIT_Q_TYPE_ERROR
[2199] MQRC_DEF_XMIT_Q_USAGE_ERROR
[2201] MQRC_NAME_IN_USE
[2202] MQRC_CONNECTION_QUIESCING
[2203] MQRC_CONNECTION_STOPPING
[2204] MQRC_ADAPTER_NOT_AVAILABLE
[2206] MQRC_MSG_ID_ERROR
[2207] MQRC_CORREL_ID_ERROR
[2208] MQRC_FILE_SYSTEM_ERROR
[2209] MQRC_NO_MSG_LOCKED
[2216] MQRC_FILE_NOT_AUDITED
[2217] MQRC_CONNECTION_NOT_AUTHORIZED
[2218] MQRC_MSG_TOO_BIG_FOR_CHANNEL
[2219] MQRC_CALL_IN_PROGRESS
[2220] MQRC_RMH_ERROR
[2222] MQRC_Q_MGR_ACTIVE
[2223] MQRC_Q_MGR_NOT_ACTIVE
[2224] MQRC_Q_DEPTH_HIGH
[2225] MQRC_Q_DEPTH_LOW
[2226] MQRC_Q_SERVICE_INTERVAL_HIGH
[2227] MQRC_Q_SERVICE_INTERVAL_OK
[2232] MQRC_UNIT_OF_WORK_NOT_STARTED
[2233] MQRC_CHANNEL_AUTO_DEF_OK
[2234] MQRC_CHANNEL_AUTO_DEF_ERROR
[2235] MQRC_CFH_ERROR
[2236] MQRC_CFIL_ERROR
[2237] MQRC_CFIN_ERROR
[2238] MQRC_CFSL_ERROR
[2239] MQRC_CFST_ERROR
[2241] MQRC_INCOMPLETE_GROUP
[2242] MQRC_INCOMPLETE_MSG
[2243] MQRC_INCONSISTENT_CCSIDS
[2244] MQRC_INCONSISTENT_ENCODINGS
[2245] MQRC_INCONSISTENT_UOW
[2246] MQRC_INVALID_MSG_UNDER_CURSOR
[2247] MQRC_MATCH_OPTIONS_ERROR
[2248] MQRC_MDE_ERROR
[2249] MQRC_MSG_FLAGS_ERROR
[2250] MQRC_MSG_SEQ_NUMBER_ERROR
[2251] MQRC_OFFSET_ERROR
[2252] MQRC_ORIGINAL_LENGTH_ERROR
[2253] MQRC_SEGMENT_LENGTH_ZERO
[2255] MQRC_UOW_NOT_AVAILABLE
[2256] MQRC_WRONG_GMO_VERSION
[2257] MQRC_WRONG_MD_VERSION
[2258] MQRC_GROUP_ID_ERROR
[2259] MQRC_INCONSISTENT_BROWSE
[2260] MQRC_XQH_ERROR
[2261] MQRC_SRC_ENV_ERROR
[2262] MQRC_SRC_NAME_ERROR
[2263] MQRC_DEST_ENV_ERROR
[2264] MQRC_DEST_NAME_ERROR
[2265] MQRC_TM_ERROR
[2266] MQRC_CLUSTER_EXIT_ERROR
[2267] MQRC_CLUSTER_EXIT_LOAD_ERROR
[2268] MQRC_CLUSTER_PUT_INHIBITED
[2269] MQRC_CLUSTER_RESOURCE_ERROR
[2270] MQRC_NO_DESTINATIONS_AVAILABLE
[2271] MQRC_CONN_TAG_IN_USE
[2272] MQRC_PARTIALLY_CONVERTED
[2273] MQRC_CONNECTION_ERROR
[2274] MQRC_OPTION_ENVIRONMENT_ERROR
[2277] MQRC_CD_ERROR
[2278] MQRC_CLIENT_CONN_ERROR
[2279] MQRC_CHANNEL_STOPPED_BY_USER
[2280] MQRC_HCONFIG_ERROR
[2281] MQRC_FUNCTION_ERROR
[2282] MQRC_CHANNEL_STARTED
[2283] MQRC_CHANNEL_STOPPED
[2284] MQRC_CHANNEL_CONV_ERROR
[2285] MQRC_SERVICE_NOT_AVAILABLE
[2286] MQRC_INITIALIZATION_FAILED
[2287] MQRC_TERMINATION_FAILED
[2288] MQRC_UNKNOWN_Q_NAME
[2289] MQRC_SERVICE_ERROR
[2290] MQRC_Q_ALREADY_EXISTS
[2291] MQRC_USER_ID_NOT_AVAILABLE
[2292] MQRC_UNKNOWN_ENTITY
[2293] MQRC_UNKNOWN_AUTH_ENTITY
[2294] MQRC_UNKNOWN_REF_OBJECT
[2295] MQRC_CHANNEL_ACTIVATED
[2296] MQRC_CHANNEL_NOT_ACTIVATED
[2297] MQRC_UOW_CANCELED
[2298] MQRC_FUNCTION_NOT_SUPPORTED
[2299] MQRC_SELECTOR_TYPE_ERROR
[2300] MQRC_COMMAND_TYPE_ERROR
[2301] MQRC_MULTIPLE_INSTANCE_ERROR
[2302] MQRC_SYSTEM_ITEM_NOT_ALTERABLE
[2303] MQRC_BAG_CONVERSION_ERROR
[2304] MQRC_SELECTOR_OUT_OF_RANGE
[2305] MQRC_SELECTOR_NOT_UNIQUE
[2306] MQRC_INDEX_NOT_PRESENT
[2307] MQRC_STRING_ERROR
[2308] MQRC_ENCODING_NOT_SUPPORTED
[2309] MQRC_SELECTOR_NOT_PRESENT
[2310] MQRC_OUT_SELECTOR_ERROR
[2311] MQRC_STRING_TRUNCATED
[2312] MQRC_SELECTOR_WRONG_TYPE
[2313] MQRC_INCONSISTENT_ITEM_TYPE
[2314] MQRC_INDEX_ERROR
[2315] MQRC_SYSTEM_BAG_NOT_ALTERABLE
[2316] MQRC_ITEM_COUNT_ERROR
[2317] MQRC_FORMAT_NOT_SUPPORTED
[2318] MQRC_SELECTOR_NOT_SUPPORTED
[2319] MQRC_ITEM_VALUE_ERROR
[2320] MQRC_HBAG_ERROR
[2321] MQRC_PARAMETER_MISSING
[2322] MQRC_CMD_SERVER_NOT_AVAILABLE
[2323] MQRC_STRING_LENGTH_ERROR
[2324] MQRC_INQUIRY_COMMAND_ERROR
[2325] MQRC_NESTED_BAG_NOT_SUPPORTED
[2326] MQRC_BAG_WRONG_TYPE
[2327] MQRC_ITEM_TYPE_ERROR
[2328] MQRC_SYSTEM_BAG_NOT_DELETABLE
[2329] MQRC_SYSTEM_ITEM_NOT_DELETABLE
[2330] MQRC_CODED_CHAR_SET_ID_ERROR
[2331] MQRC_MSG_TOKEN_ERROR
[2332] MQRC_MISSING_WIH
[2333] MQRC_WIH_ERROR
[2334] MQRC_RFH_ERROR
[2335] MQRC_RFH_STRING_ERROR
[2336] MQRC_RFH_COMMAND_ERROR
[2337] MQRC_RFH_PARM_ERROR
[2338] MQRC_RFH_DUPLICATE_PARM
[2339] MQRC_RFH_PARM_MISSING
[2340] MQRC_CHAR_CONVERSION_ERROR
[2341] MQRC_UCS2_CONVERSION_ERROR
[2342] MQRC_DB2_NOT_AVAILABLE
[2343] MQRC_OBJECT_NOT_UNIQUE
[2344] MQRC_CONN_TAG_NOT_RELEASED
[2345] MQRC_CF_NOT_AVAILABLE
[2346] MQRC_CF_STRUC_IN_USE
[2347] MQRC_CF_STRUC_LIST_HDR_IN_USE
[2348] MQRC_CF_STRUC_AUTH_FAILED
[2349] MQRC_CF_STRUC_ERROR
[2350] MQRC_CONN_TAG_NOT_USABLE
[2351] MQRC_GLOBAL_UOW_CONFLICT
[2352] MQRC_LOCAL_UOW_CONFLICT
[2353] MQRC_HANDLE_IN_USE_FOR_UOW
[2354] MQRC_UOW_ENLISTMENT_ERROR
[2355] MQRC_UOW_MIX_NOT_SUPPORTED
[2356] MQRC_WXP_ERROR
[2357] MQRC_CURRENT_RECORD_ERROR
[2358] MQRC_NEXT_OFFSET_ERROR
[2359] MQRC_NO_RECORD_AVAILABLE
[2360] MQRC_OBJECT_LEVEL_INCOMPATIBLE
[2361] MQRC_NEXT_RECORD_ERROR
[2111] MQRC_SOURCE_CCSID_ERROR
[2112] MQRC_SOURCE_INTEGER_ENC_ERROR
[2113] MQRC_SOURCE_DECIMAL_ENC_ERROR
[2114] MQRC_SOURCE_FLOAT_ENC_ERROR
[2115] MQRC_TARGET_CCSID_ERROR
[2116] MQRC_TARGET_INTEGER_ENC_ERROR
[2117] MQRC_TARGET_DECIMAL_ENC_ERROR
[2118] MQRC_TARGET_FLOAT_ENC_ERROR
[2119] MQRC_NOT_CONVERTED
[2120] MQRC_CONVERTED_MSG_TOO_BIG
[2120] MQRC_TRUNCATED
[2121] MQRC_NO_EXTERNAL_PARTICIPANTS
[2122] MQRC_PARTICIPANT_NOT_AVAILABLE
[2123] MQRC_OUTCOME_MIXED
[2124] MQRC_OUTCOME_PENDING
[2125] MQRC_BRIDGE_STARTED
[2126] MQRC_BRIDGE_STOPPED
[2127] MQRC_ADAPTER_STORAGE_SHORTAGE
[2128] MQRC_UOW_IN_PROGRESS
[2129] MQRC_ADAPTER_CONN_LOAD_ERROR
[2130] MQRC_ADAPTER_SERV_LOAD_ERROR
[2131] MQRC_ADAPTER_DEFS_ERROR
[2132] MQRC_ADAPTER_DEFS_LOAD_ERROR
[2133] MQRC_ADAPTER_CONV_LOAD_ERROR
[2134] MQRC_BO_ERROR
[2135] MQRC_DH_ERROR
[2136] MQRC_MULTIPLE_REASONS
[2137] MQRC_OPEN_FAILED
[2138] MQRC_ADAPTER_DISC_LOAD_ERROR
[2139] MQRC_CNO_ERROR
[2140] MQRC_CICS_WAIT_FAILED
[2141] MQRC_DLH_ERROR
[2142] MQRC_HEADER_ERROR
[2143] MQRC_SOURCE_LENGTH_ERROR
[2144] MQRC_TARGET_LENGTH_ERROR
[2145] MQRC_SOURCE_BUFFER_ERROR
[2146] MQRC_TARGET_BUFFER_ERROR
[2148] MQRC_IIH_ERROR
[2149] MQRC_PCF_ERROR
[2150] MQRC_DBCS_ERROR
[2152] MQRC_OBJECT_NAME_ERROR
[2153] MQRC_OBJECT_Q_MGR_NAME_ERROR
[2154] MQRC_RECS_PRESENT_ERROR
[2155] MQRC_OBJECT_RECORDS_ERROR
[2156] MQRC_RESPONSE_RECORDS_ERROR
[2157] MQRC_ASID_MISMATCH
[2158] MQRC_PMO_RECORD_FLAGS_ERROR
[2159] MQRC_PUT_MSG_RECORDS_ERROR
[2160] MQRC_CONN_ID_IN_USE
[2161] MQRC_Q_MGR_QUIESCING
[2162] MQRC_Q_MGR_STOPPING
[2163] MQRC_DUPLICATE_RECOV_COORD
[2173] MQRC_PMO_ERROR
[2182] MQRC_API_EXIT_NOT_FOUND
[2183] MQRC_API_EXIT_LOAD_ERROR
[2184] MQRC_REMOTE_Q_NAME_ERROR
[2185] MQRC_INCONSISTENT_PERSISTENCE
[2186] MQRC_GMO_ERROR
[2187] MQRC_CICS_BRIDGE_RESTRICTION
[2188] MQRC_STOPPED_BY_CLUSTER_EXIT
[2189] MQRC_CLUSTER_RESOLUTION_ERROR
[2190] MQRC_CONVERTED_STRING_TOO_BIG
[2191] MQRC_TMC_ERROR
[2192] MQRC_PAGESET_FULL
[2192] MQRC_STORAGE_MEDIUM_FULL
[2193] MQRC_PAGESET_ERROR
[2194] MQRC_NAME_NOT_VALID_FOR_TYPE
[2195] MQRC_UNEXPECTED_ERROR
[2196] MQRC_UNKNOWN_XMIT_Q
[2197] MQRC_UNKNOWN_DEF_XMIT_Q
[2198] MQRC_DEF_XMIT_Q_TYPE_ERROR
[2199] MQRC_DEF_XMIT_Q_USAGE_ERROR
[2201] MQRC_NAME_IN_USE
[2202] MQRC_CONNECTION_QUIESCING
[2203] MQRC_CONNECTION_STOPPING
[2204] MQRC_ADAPTER_NOT_AVAILABLE
[2206] MQRC_MSG_ID_ERROR
[2207] MQRC_CORREL_ID_ERROR
[2208] MQRC_FILE_SYSTEM_ERROR
[2209] MQRC_NO_MSG_LOCKED
[2216] MQRC_FILE_NOT_AUDITED
[2217] MQRC_CONNECTION_NOT_AUTHORIZED
[2218] MQRC_MSG_TOO_BIG_FOR_CHANNEL
[2219] MQRC_CALL_IN_PROGRESS
[2220] MQRC_RMH_ERROR
[2222] MQRC_Q_MGR_ACTIVE
[2223] MQRC_Q_MGR_NOT_ACTIVE
[2224] MQRC_Q_DEPTH_HIGH
[2225] MQRC_Q_DEPTH_LOW
[2226] MQRC_Q_SERVICE_INTERVAL_HIGH
[2227] MQRC_Q_SERVICE_INTERVAL_OK
[2232] MQRC_UNIT_OF_WORK_NOT_STARTED
[2233] MQRC_CHANNEL_AUTO_DEF_OK
[2234] MQRC_CHANNEL_AUTO_DEF_ERROR
[2235] MQRC_CFH_ERROR
[2236] MQRC_CFIL_ERROR
[2237] MQRC_CFIN_ERROR
[2238] MQRC_CFSL_ERROR
[2239] MQRC_CFST_ERROR
[2241] MQRC_INCOMPLETE_GROUP
[2242] MQRC_INCOMPLETE_MSG
[2243] MQRC_INCONSISTENT_CCSIDS
[2244] MQRC_INCONSISTENT_ENCODINGS
[2245] MQRC_INCONSISTENT_UOW
[2246] MQRC_INVALID_MSG_UNDER_CURSOR
[2247] MQRC_MATCH_OPTIONS_ERROR
[2248] MQRC_MDE_ERROR
[2249] MQRC_MSG_FLAGS_ERROR
[2250] MQRC_MSG_SEQ_NUMBER_ERROR
[2251] MQRC_OFFSET_ERROR
[2252] MQRC_ORIGINAL_LENGTH_ERROR
[2253] MQRC_SEGMENT_LENGTH_ZERO
[2255] MQRC_UOW_NOT_AVAILABLE
[2256] MQRC_WRONG_GMO_VERSION
[2257] MQRC_WRONG_MD_VERSION
[2258] MQRC_GROUP_ID_ERROR
[2259] MQRC_INCONSISTENT_BROWSE
[2260] MQRC_XQH_ERROR
[2261] MQRC_SRC_ENV_ERROR
[2262] MQRC_SRC_NAME_ERROR
[2263] MQRC_DEST_ENV_ERROR
[2264] MQRC_DEST_NAME_ERROR
[2265] MQRC_TM_ERROR
[2266] MQRC_CLUSTER_EXIT_ERROR
[2267] MQRC_CLUSTER_EXIT_LOAD_ERROR
[2268] MQRC_CLUSTER_PUT_INHIBITED
[2269] MQRC_CLUSTER_RESOURCE_ERROR
[2270] MQRC_NO_DESTINATIONS_AVAILABLE
[2271] MQRC_CONN_TAG_IN_USE
[2272] MQRC_PARTIALLY_CONVERTED
[2273] MQRC_CONNECTION_ERROR
[2274] MQRC_OPTION_ENVIRONMENT_ERROR
[2277] MQRC_CD_ERROR
[2278] MQRC_CLIENT_CONN_ERROR
[2279] MQRC_CHANNEL_STOPPED_BY_USER
[2280] MQRC_HCONFIG_ERROR
[2281] MQRC_FUNCTION_ERROR
[2282] MQRC_CHANNEL_STARTED
[2283] MQRC_CHANNEL_STOPPED
[2284] MQRC_CHANNEL_CONV_ERROR
[2285] MQRC_SERVICE_NOT_AVAILABLE
[2286] MQRC_INITIALIZATION_FAILED
[2287] MQRC_TERMINATION_FAILED
[2288] MQRC_UNKNOWN_Q_NAME
[2289] MQRC_SERVICE_ERROR
[2290] MQRC_Q_ALREADY_EXISTS
[2291] MQRC_USER_ID_NOT_AVAILABLE
[2292] MQRC_UNKNOWN_ENTITY
[2293] MQRC_UNKNOWN_AUTH_ENTITY
[2294] MQRC_UNKNOWN_REF_OBJECT
[2295] MQRC_CHANNEL_ACTIVATED
[2296] MQRC_CHANNEL_NOT_ACTIVATED
[2297] MQRC_UOW_CANCELED
[2298] MQRC_FUNCTION_NOT_SUPPORTED
[2299] MQRC_SELECTOR_TYPE_ERROR
[2300] MQRC_COMMAND_TYPE_ERROR
[2301] MQRC_MULTIPLE_INSTANCE_ERROR
[2302] MQRC_SYSTEM_ITEM_NOT_ALTERABLE
[2303] MQRC_BAG_CONVERSION_ERROR
[2304] MQRC_SELECTOR_OUT_OF_RANGE
[2305] MQRC_SELECTOR_NOT_UNIQUE
[2306] MQRC_INDEX_NOT_PRESENT
[2307] MQRC_STRING_ERROR
[2308] MQRC_ENCODING_NOT_SUPPORTED
[2309] MQRC_SELECTOR_NOT_PRESENT
[2310] MQRC_OUT_SELECTOR_ERROR
[2311] MQRC_STRING_TRUNCATED
[2312] MQRC_SELECTOR_WRONG_TYPE
[2313] MQRC_INCONSISTENT_ITEM_TYPE
[2314] MQRC_INDEX_ERROR
[2315] MQRC_SYSTEM_BAG_NOT_ALTERABLE
[2316] MQRC_ITEM_COUNT_ERROR
[2317] MQRC_FORMAT_NOT_SUPPORTED
[2318] MQRC_SELECTOR_NOT_SUPPORTED
[2319] MQRC_ITEM_VALUE_ERROR
[2320] MQRC_HBAG_ERROR
[2321] MQRC_PARAMETER_MISSING
[2322] MQRC_CMD_SERVER_NOT_AVAILABLE
[2323] MQRC_STRING_LENGTH_ERROR
[2324] MQRC_INQUIRY_COMMAND_ERROR
[2325] MQRC_NESTED_BAG_NOT_SUPPORTED
[2326] MQRC_BAG_WRONG_TYPE
[2327] MQRC_ITEM_TYPE_ERROR
[2328] MQRC_SYSTEM_BAG_NOT_DELETABLE
[2329] MQRC_SYSTEM_ITEM_NOT_DELETABLE
[2330] MQRC_CODED_CHAR_SET_ID_ERROR
[2331] MQRC_MSG_TOKEN_ERROR
[2332] MQRC_MISSING_WIH
[2333] MQRC_WIH_ERROR
[2334] MQRC_RFH_ERROR
[2335] MQRC_RFH_STRING_ERROR
[2336] MQRC_RFH_COMMAND_ERROR
[2337] MQRC_RFH_PARM_ERROR
[2338] MQRC_RFH_DUPLICATE_PARM
[2339] MQRC_RFH_PARM_MISSING
[2340] MQRC_CHAR_CONVERSION_ERROR
[2341] MQRC_UCS2_CONVERSION_ERROR
[2342] MQRC_DB2_NOT_AVAILABLE
[2343] MQRC_OBJECT_NOT_UNIQUE
[2344] MQRC_CONN_TAG_NOT_RELEASED
[2345] MQRC_CF_NOT_AVAILABLE
[2346] MQRC_CF_STRUC_IN_USE
[2347] MQRC_CF_STRUC_LIST_HDR_IN_USE
[2348] MQRC_CF_STRUC_AUTH_FAILED
[2349] MQRC_CF_STRUC_ERROR
[2350] MQRC_CONN_TAG_NOT_USABLE
[2351] MQRC_GLOBAL_UOW_CONFLICT
[2352] MQRC_LOCAL_UOW_CONFLICT
[2353] MQRC_HANDLE_IN_USE_FOR_UOW
[2354] MQRC_UOW_ENLISTMENT_ERROR
[2355] MQRC_UOW_MIX_NOT_SUPPORTED
[2356] MQRC_WXP_ERROR
[2357] MQRC_CURRENT_RECORD_ERROR
[2358] MQRC_NEXT_OFFSET_ERROR
[2359] MQRC_NO_RECORD_AVAILABLE
[2360] MQRC_OBJECT_LEVEL_INCOMPATIBLE
[2361] MQRC_NEXT_RECORD_ERROR


ref:
Interfacing with IBM WebSphere MQ (formally IBM MQSeries) from .NET, 4 May 2006
http://www.codeproject.com/KB/cross-platform/DotNetWebSphere.aspx

tag : WebSphere MQ JMS MQOO MQRC

2009-06-04 00:05 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WMQ/ start up & shotdown

□start queue manager
strmqm hoge_queue_manager

□stop queue manager
endmqm hoge_queue_manager

□a error log of MQ
/var/mqm/qmgrs/hoge_queue_manager/errors

tag : WebSphere MQ WMQ

2009-06-02 06:57 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WMQ/ MQJE001: Completion Code 2, Reason 2059

==exception==
WebSphere/ WMQ/ MQJE001: An MQException occurred: Completion Code 2, Reason 2059

==env==
WMQ

==reason==
2059: ネットワーク接続エラー -> Windowsの場合ファイアウォールを確認
2195: CCSID不一致エラー
2009: チャネル名不正エラー

==log==
Caused by: com.ibm.mq.MQException: MQJE001: MQException が発生しました: 完了コード 2、理由 2059\n\
at com.ibm.mq.MQManagedConnectionJ11.(MQManagedConnectionJ11.java:212)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:318)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:338)
at com.ibm.mq.StoredManagedConnection.(StoredManagedConnection.java:84)
at com.ibm.mq.MQSimpleConnectionManager.allocateConnection(MQSimpleConnectionManager.java:168)
at com.ibm.mq.MQQueueManagerFactory.obtainBaseMQQueueManager(MQQueueManagerFactory.java:772)
at com.ibm.mq.MQQueueManagerFactory.procure(MQQueueManagerFactory.java:697)
at com.ibm.mq.MQQueueManagerFactory.constructQueueManager(MQQueueManagerFactory.java:657)
at com.ibm.mq.MQQueueManagerFactory.createQueueManager(MQQueueManagerFactory.java:153)
at com.ibm.mq.MQQueueManager.(MQQueueManager.java:451)

ref:
http://tcl.s26.xrea.com/wiki/WebsphereMQ

tag : WebSphere MQ WMQ

2009-05-29 01:06 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WMQ/ MQException: MQJE001: Completion Code 2, Reason 2033

==exception==
com.ibm.mq.MQException: MQJE001: 完了コード 2、理由 2033
(MQMException.MQRC_NO_MSG_AVAILABLE)

==env==
WMQ

==reason==
Reason code 2033 is "No message available". This means that the MQ
receive process has asked to receive a message but there is no message
to receive.

==log==
Throwable occurred: com.ibm.mq.MQException: MQJE001: 完了コード 2、理由 2033
at com.ibm.mq.MQQueue.get(MQQueue.java:1033)
at com.ibm.mq.MQQueue.get(MQQueue.java:1294)


ref:
http://edi.stylusstudio.com/msg015475.htm

tag : WebSphere MQ WMQ

2009-05-29 01:03 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WebSphere/ MQ & JMS

MQMQRFH2ヘッダが付与される
JMSMQRFH2ヘッダが付与されない

MQRFH2ヘッダのないメッセージ
(ターゲットクライアントMQで送信されたメッセージ)
JMSで読み出すと、
MQMDヘッダからJMSヘッダ、プロパティが生成される。

ref:
MQ: JMSキューの「ターゲット・クライアント」設定
http://www-01.ibm.com/support/docview.wss?uid=std3f50c79d4cfef8f724925738c000bdde7

tag : WebSphere JMS MQ MQRFH2

2009-05-25 23:26 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WMQ/ JMSカスタム・バインディング

JMSカスタム・バインディングとは
WebSphere ESBのJMSバインディング
JMSメッセージのうち、[JMSテキストメッセージ]と[JMSオブジェクトメッセージ]をハンドリングできる。
JMSメッセージの本体部分が、
[ビジネスオブジェクトをXML形式で表したテキストメッセージ]であれば、
エクスポートかインポートで、
各XML要素とビジネスオブジェクトの各要素のマッピングが自動的に処理される。
[マップメッセージ]と[ストリームメッセージ]、[バイトメッセージ]を、
WebSphere ESBのビジネスオブジェクトとマッピングする場合、
送受信するJMSメッセージのタイプを判別して、
そのメッセージの内容を、ビジネスオブジェクトの各要素に適切にマッピングするロジックを記述せんといけん。

WebSphere MQのメッセージでは、
様々なデータ形式が使用されており、
テキストメッセージであっても、
固定長メッセージ形式や、
CSVなどのタグ・デリミタ形式で、
必ずしもXML形式のメッセージだけでない。
XML形式以外のデータにも対応出来るような仕組みが、JMSカスタム・バインディング。

*ESB:WebSphere Enterprise Service Bus


WebSphere MQとの接続時の考慮点
JMSメッセージとWebSphere MQメッセージは透過的に使用可能。
JMSテキストメッセージは、そのままWebSphere MQテキストメッセージとして送受信/処理できる。

一般的に
WebSphere MQサーバアプリは、
受信メッセージのメッセージIDを返信メッセージのCorrelationIDにセットして返信する。

WebSphere ESBのエクスポートのJMSバインディングでは、
リクエストメッセージを呼び出す処理を認識できるように
JMSメッセージにセットされたTargetFunctionNameというユーザ定義のプロパティをチェックする。
JMSユーザ定義プロパティであるTargetFunctionNameプロパティは、MQRFH2ヘッダにマッピングされる。
※サービスプロバイダ側(インポート側)のWebSphere MQでは、
 通常TargetFunctionName属性を意識する必要ない。
 何らかの理由で、受信側のMQアプリで、TargetFunctionNameを明示的にハンドリングしたい場合は、
 WebSphere MQのMQRFH2ヘッダを利用する。



ref:
超入門!WebSphere ESB: 第4回 JMSカスタム・バインディングとWebSphere MQとの連携
http://www.ibm.com/developerworks/jp/websphere/library/esb/esb_intro/4.html

tag : WebSphere JMS MQ

2009-05-25 23:24 : __j2ee__jms : コメント : 0 : トラックバック : 1 :

WMQ/ MQRFH2 フォルダ&Msd フィールド

WebSphere MQメッセージヘッダ(MQRFH2)と記述子(MQMD)には、
WebSphere MQメッセージ本体のフォーマットに関する情報を含めることができる。
WebSphere MQフォーマットからのメッセージの変換時には、MQRFH2とMQMDに含まれた情報を使用し、
WebSphere MQフォーマットへのメッセージの変換時には、MQRFH2とMQMDに書き込む。


MQRFH2 <'mcd> フォルダ&Msd フィールド
ペイロード・フォーマット関連情報(JMSフォーマット情報)を保持する。


JMSメッセージに、
WebSphere MQで文字データとしてエンコードされた本体(TextMessage, StreamMessage or MapMessage)が含まれている場合、
JMS_IBM_Character_Setを設定すると、サービス統合は、テキストをWebSphere MQメッセージ本体のコード化文字セットに変換する。

JMSメッセージに、
文字データでない本体(ByteMessage or ObjectMessage)が含まれている場合、
JMS_IBM_Character_Setを指定しても、
サービス統合は、バイト変換せず、
メッセージ本体内の全ての文字データが既に指定されたコード化文字セットを使用してエンコードされていることをWebSphere MQに指示する。
JMS_IBM_Formatの値がWebSphere MQによって認識されるフォーマットである場合、
受け取り側のアプリで必要なコード化文字セットに文字データを変換できる。

サービス統合は、
メッセージをWebSphere MQフォーマットから変換する際、
MQRFH2MQRFH2がない場合はMQMD)のフィールドから、
JMS_IBM_Character_SetとJMS_IBM_Encodingプロパティを設定する。

JMSメッセージが
TextMessage, StreamMessage, MapMessage or ObjectMessageの場合は、
アプリは、JMS_IBM_Character_SetとJMS_IBM_Encodingプロパティ値を使用しない。
BytesMessageの場合も同様。


ref:
サービス統合におけるメッセージ本体と WebSphere MQ フォーマット間の相互変換の仕組み
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.pmc.express.doc/ref/rjc0005_.html

tag : WebSphere JMS MQ MQRFH2

2009-05-25 23:23 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WebLogic/ JMS/ Message

■構成要素
+ヘッダフィールド
+プロパティフィールド
+本文


■ヘッダフィールド
すべてのメッセージに、デフォルトで挿入され、メッセージコンシューマで利用できる標準のフィールド。
JMSCorrelationID
JMSDeliveryMode
JMSDeliveryTime
JMSDestination
JMSExpiration
JMSMessageID
JMSRedelivered
JMSReplyTo
JMSTimestamp
JMSType


■プロパティフィールド
送信側アプリによって追加されたヘッダフィールドが格納されるフィールド。
標準的なJavano名前と値の組合せ。
プロパティ名は、javax.jms.Message Javadocで定義されているメッセージセレクタの構文仕様に準拠していること。
有効な値は、boolean, byte, double, float, int, long, String。
WebLogic Serverでは、以下のJMS(JMSX)定義済みプロパティ(JMS1.1仕様)をサポート。
JMSXUserID
JMSXDeliveryCount
JMSXGroupID
JMSXGroupSeq


■本文
プロデューサからコンシューマに配信される内容。
↓JMSで定義されているメッセージタイプ。(いずれも、javax.jms.Messageを拡張する。)
javax.jms.BytesMessage
javax.jms.MapMessage
javax.jms.ObjectMessage
javax.jms.StreamMessage
javax.jms.TextMessage
weblogic.jms.extensions.XMLMessage



ref:
WebLogic JMS について
http://otndnld.oracle.co.jp/document/products/wls/docs100/jms/fund.html

tag : WebLogic JMS

2009-05-25 01:26 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WMQ/ Intro

JMS (Java Message Service)のIBM WebSphere MQクラスは、
JMSアプリによるWebSphere MQシステムへのアクセスを可能にする一連のJavaクラス。
point-to-pointとPublish/Subscribe両方のJMSモデルがサポート対象。


ref:
IBM WebSphere MQ JMS の概要
http://publib.boulder.ibm.com/tividd/td/ITAMFBI/SC23-4831-01/ja_JA/HTML/ADM51mst40.htm
IBM WebSphere MQ JMS Overview
http://publib.boulder.ibm.com/infocenter/tivihelp/v2r1/index.jsp?topic=/com.ibm.itamfbi.doc_5.1/ADM51mst40.htm

tag : WebSphere JMS MQ

2009-05-25 01:02 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

WMQ/ 構成要素

■構成要素
+メッセージ
 アプリ間で受け渡すデータ
MQオブジェクト
 MQを使用する際の管理対象
 -キューマネージャー
 -キュー
 -チャンネル
 -プロセス定義
 -名前リスト
 -リスナー
 -認証情報オブジェクト
 -管理トピック・オブジェクト
 -サービス(WebSphere MQ for z/OS 除く)
 -キュー共用グループ(WebSphere MQ for z/OS のみ)
 -ストレージ・クラス(WebSphere MQ for z/OS のみ)
 管理人はミューマネージャー。


■メッセージ
キューを介してプログラム(プロセス)間で渡されるデータ。
MQMD(メッセージ・ヘッダー)とアプリケーション・データ(ユーザー・データ)から成る。

□メッセージ・ヘッダー
以下等の情報が定義されたメッセージ記述子(MQMD)。
 -メッセージタイプ
 -メッセージID/相関ID
 -Reply-Toキュー名
 -メッセージの永続性
 -メッセージの優先順位
 -コンテキスト(発行元の情報)

□ユーザー・データ
任意のデータ。
全て文字列の場合は、パラメータの指定のみで文字コード変換できる。
バイナリデータ混合の場合は、EXITを作成して文字コードを変換できる。

□メッセージタイプ
-データグラム
 リプライを要さない一方向のメッセージ。
-リクエスト
 リプライを必要とするメッセージ。
 通常ReplyToQ、ReplyToQMgrフィールドに
 リプライメッセージの宛先を指定する。
-リプライ
 リクエストに対する応答メッセージ。
 通常、相関IDでリクエストとリプライを関連付ける。
-レポート
 MQの機能で、例外情報などの通知メッセージを送信できる。


■キュー・マネージャー
キューイング・サービスをアプリに提供し、MQオブジェクトの管理役。
1システムに複数QMgr(キューマネージャ)の配置も可。

□主な役割:
-アプリ発行のMQIを受け取り、メッセージを指定のキューに書き込む。
 ※失敗時は、理由コードと一緒にアプリに通知。
-受け取ったコマンドに応じてオブジェクトの属性を変更する。
-トリガー・イベント等の特殊イベントを生成する。
-オブジェクトの権限をチェックする。

□主な属性:
-CCSID(文字コード)
-最大メッセージ長
-デフォルト・デッドレターキュー名
-デフォルト・トランスミッションキュー名

□リモートとローカル
+アプリが接続されているQMgrは、
 そのアプリに対して、ローカルQMgrである。
 ローカルQMgrが属するシステムをローカルシステムと呼ぶ。
+リモートQMgrは、ローカルQMgr以外の任意のQMgrのこと。
 リモートQMgrが存在するシステムをリモートシステムと呼ぶ。


■キュー
アプリからのメッセージを保持するための仕組み。

□キューの種類
-ローカルキュー
 メッセージを実際に格納できるキュー。
-リモートキュー
 実体のないキュー。
-別名キュー
-モデルキュー

□ローカルキュー
アプリが接続されているQMgrに属するキュー。
属性:
-最大メッセージ数
-現行メッセージ数
-GETの可否
-PUTの可否
-デフォルト優先順位
-デフォルトメッセージの永続性

□リモートキュー
他のQMgrに属するキュー。

□別名キュー
アプリは、別名キューで間接的にキューを参照することで、キューへアクセスできる。
別名キュー名がMQI呼び出しで使われると、その名は実行時にローカルキューかリモートキュー名として解釈される。

□モデルキュー
動的キュー作成のテンプレート。
動的キューの種類:
+一時キュー
 アプリやキュー管理プログラム再始動すると消滅する。
+永続キュー
 アプリやキュー管理プログラム再始動しても存続する。

□特殊な目的を持つローカルキュー
*トランスミッションキュー
 リモートQMgr宛のメッセージを一時的に保管する転送用のキュー。
*イニシエーションキュー
 トリガリング機能を使用する際に、
 QMgrによってトリガー・メッセージが書き出されるキュー。
*デッドレターキュー
 QMgrやMCA等から配布不可能なメッセージが書き出されるキュー。
 別名は、送達不能キュー。
*システムコマンドキュー
 MQの管理コマンドを受け付けるためのキュー。
 ※ MQSeries for VSE/ESAでは、未サポート。
 ※ WebSphere MQ for z/OSでは、SYSTEM.COMMAND.INPUTゆう名前で、
  受け付けられるコマンド形式MQSCコマンド。
*システムデフォルトキュー
 キューのパラメータのデフォルト値を持つキュー。


■チャンネル
あるQMgrと別のQMgrを結ぶ通信パスを提供するオブジェクトで、
分散メッセージ・キューイングで使用される。
通信プロトコルをアプリから隠蔽するのが役割。


■プロセス定義
QMgr上のトリガー・イベントに応答して開始されるアプリを定義するもの。
主な属性:
-アプリID
-アプリタイプ
-アプリ特有のデータ
-環境情報


■名前リスト
他種のMQオブジェクト名のリストを提供するもの。
アプリで複数の宛先に対してメッセージ送出する時に使用。


■リスナーオブジェクト
ネットワーク要求を受け取るプロセスで、関連付けられたチャンネルを始動する役割。
runmqlsr制御コマンドで始動する。


■サービスオブジェクト
QMgrが開始/停止時に実行するプログラムを定義するオブジェクト。
ServerServiceObjectとCommandServiceObjectがある。


■管理トピック・オブジェクト
Pub/Subでパブリッシュされる情報のサブジェクトを記述する文字ストリングのこと。


■認証情報オブジェクト
WebSphere MQのSecure Sockets Layer (SSL)セキュリティサポートの一部。



ref:
MQ設計虎の巻: 第2回「WebSphere MQの特長と主な機能(後編)」
http://www.ibm.com/developerworks/jp/websphere/library/wmq/toranomaki/2.html

tag : MQ WebSphere

2009-05-25 00:44 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

LINKS/ WMQ

--------------------------------------------------
■Introductions
WebSphere MQ 入門書
http://www.ibm.com/developerworks/jp/websphere/library/wmq/mq_intro/index.html

MQ設計虎の巻
http://www.ibm.com/developerworks/jp/websphere/library/wmq/toranomaki/

WebSphere MQ Java の使用
[DL] http://www.elink.ibmlink.ibm.com/puc/jsp/index.jsp?country=760&language=JPN&function=OutputPubsDetails&activelink=search&publicationnumber=SC88-9228-02#
[PDF] http://publibfp.boulder.ibm.com/epubs/pdf/c8892282.pdf

MQ java 基础编程
http://www.itpub.net/archiver/tid-738569.html

--------------------------------------------------
■Forums
□developerWorks > WebSphere > Forums > WebSphere MQ
http://www.ibm.com/developerworks/forums/forum.jspa?forumID=280

WebSphere Community Forum > WebSphere Product > Reload this Page WebSphere MQ
http://ecommunity.groupintelligence.com/websphere/forums/forumdisplay.php?f=46

--------------------------------------------------
■Information / Support center
□Welcome to the IBMR WebSphere(R) MQ information center
http://publib.boulder.ibm.com/infocenter/wmqv6/v6r0/index.jsp?topic=/com.ibm.mq.csqzav.doc/csq8704.htm

--------------------------------------------------
■API
□MQMessage
http://middleware.its.state.nc.us/middleware/Documentation/en_US/htm/csqzaw09/csqzaw0924.htm
□BytesMessage
http://middleware.its.state.nc.us/middleware/Documentation/en_US/htm/csqzaw09/csqzaw093f.htm

--------------------------------------------------
■Specific Information, Samples
□Writing a simple publish/subscribe application connecting through WebSphere MQ
http://middleware.its.state.nc.us/middleware/Documentation/en_US/htm/csqzaw09/csqzaw0931.htm

□Mapping JMS messages onto WebSphere MQ messages
http://middleware.its.state.nc.us/middleware/Documentation/en_US/htm/csqzaw09/csqzaw0937.htm

□Part 3. Programming with WebSphere MQ JMS
http://middleware.its.state.nc.us/middleware/Documentation/en_US/htm/csqzaw09/csqzaw092n.htm

□IBM WEBSPHERE MQ 接收消息中文乱码问题的处理
http://www.cnblogs.com/muskteer/articles/340322.html

□RFH2Header
http://code.google.com/p/wmq-util/source/browse/trunk/src/test/java/com/googlecode/wmqutils/?r=13#wmqutils/headers
--------------------------------------------------

tag : WebSphere MQ LINKS WMQ

2009-05-24 23:35 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

JMS/ Asynchronous Messaging

■Fundamental idea
□provide a communication abstraction that decouples collabrating distributed entities
-time decoupling --> asynchrony
-space decoupling --> anonymity
□asynchrony --> persistence of messages

■Message-Oriented Middleware
□a message-oriented middleware (MON) is a software layer acting as a kind of "middle man" between distributed entities
□most software companies offer middleware products that fall in the MOM category,
 e.g., IBM MQ Series, Oracle AQ, Sun Java System Message Queue, Microsoft Message Queueing, etc..

■Broker & Client Library
a MOMO is often based on a message broker and a client library.

■Communication models
□Point-to-point model
One-to-one communication between message producers and consumers, where each messages is consumed by one and only one consumer
□Publish/Subscribe (pub/sub) model
One-to-many communication where producers publish messages and all consumers that have subscribed receive them
□in both models, the notion of message is key

■Point-to-Point
□Each message is received by only one consumer
□Messages are placed in a queue and are persisted until they are consumed
□This model can be used to load-balance tasks cavert:
 fifo processing cannot be guaranteed

■Publish/Subscribe
□Each message is received by all subscribers
□Messages are not persisted by default
□There exists various message routing variant:
 -topic-based
 -content-based
 -location-based

■J2EE Overview
□J2EE stands for Java 2 platform, Enterprise Edition
□J2EE is the specification of a distributed multitiered application model for enterprise applications, presented as a coherent set of programming APIs
□Implementations of the J2EE specification are usually proposed in the form of application servers

■Java Messaging Service
□the java messaging service (JMS) defines the asynchronous messaging standard of the J2EE platform
JMS follows the general J2EE philosophy:
 -JMS is a specification
 -JMS implementations rely on existing products (IBM MQ Series, Oracle AQ, Sun Java System Message Queue, etc.)
 -JMS-based applications are prtable across any JMS-compliant implementation

■Executiontime
[producer JMS API ] <-> message broker <-> [consumer JMS API]
□a producer creates messages & sends them via the JMS API, specifying a message destination
□a consumer receives messages via the JMS API, specifying a message destination and an optional message selector
□a JMS-compliant product provides an implementation of the JMS API in the form of a client library that knows how to communicate natively with the message broker

■Deployment time
□start the message broker (usually via the J2EE application server)
□create the adaquate destinations
□install the Jms client library on the producer & the producer, and start them

■Unified programming model
Two communication models:
 -point-to-point (destination = queue)
 -publish/subscribe (destination = topic)

■Development: publisher
■Development: subscriver
■Development: producer
■Development: consumer
■Synchronous consumer

■Message format & types
□a JMS message is composed of three parts:
 -a header holding required fields for the client library and the message broker, e.g., priority, time-to-live, etc.
 -a list of optional properties, which act as meta-data used by the message selection mechanism.
 -a body containing the actual data of the message
□these exists various types of messages, which deffer in the type of data they carry in their body, e.g., Message, TextMessage, ObjectMessage, etc.

■Message selectors
□by default, JMS provides topic-based pub/sub
□thanks to message properties, JMS also support content-based pub/sub via message selectors
□a message selector is a string whose syntax is a subset of the SQL92 conditional expression syntax

■Quality of Service (QoS)
□parameterized Quality of Service (QoS) is usually offered by MOM products
□in JMS, the level QoS depends on the following parameters:
 -message ordering, time-to-lice & priorities
 -acknowledgement modes
 -durable subscriptions
 -delivery modes
 -transactions

■Order, priority & time-to-live
producer.send( aMessage, DeliveryMode.NON_PERSISTENT, 3/*priority*/, 5000/*time-to-live(in ms)*/);
□Jms specifies that messages are received in the order in which they were sent with respect to a given session and a given destination (commonly called FIFO order)
□JMS specifies no order across destinations or across sessions sending to the same destination
□the notion of priority allows programmers to have finer control over ordering, via the send() method
□programmers can also specify how long the message broker should keep a message, via a time-to-live parameter passed to the send() method

■Acknowledgement modes
□an acknowledgment informs the MOM (e.g., its underlying message broker) that the client has successfuly received a message
□JMS supports three acknowledgment modes:
 -AUTO_ACKNOWLEDGE
   the session automatically acknowledges the receipt of each message
 -CLIENT_ACKNOWLEDGE
   the client acknowledges programmatically, invoking acknowledge() on each message
 -DUPS_OK_AKNOWLEDGE
   more efficient variant of AUTO_ACKNOWLEDGE that can result is duplicate messages in case of faiures

■Delivery modes
□in JMS, there exists two delivery modes:
 -NON_PERSISTENT
   most efficient but less reliable, since messages are guaranteed to be delivered at most once, i.e., some might be lost, e.g., due to some filure (power outage)
 -PERSISTENT
   most reliable, since messages are guaranteed to be delivered once and only once; this is usually achieved by persisting sent messages on stable storage and keeping them until they are acknowledged
□the delivery mode can be specifies at the producer level or each time a message is sent

■Durable subscriptions
□with pub./sub, messages are only received by subscrivers present at the time of the publication
□a durable subscriver is one that wants to receive all messages published on a topic, even those published when the subscriver is inactive, i.e., when it has no associated subscriver object
□in order to tell the message broker what messages latter must provide a unique name

■transactions
□a transaction allows a group of messages to be managed as a single unit of work
□in JMS, transactions are managed by the session
□the decision to have a session trasacted must be taken at creation time:
  Session session = connection.createSession(true/*the transaction mode*/, Session.AUTO_ACKNOWLEDGE);
□as soon as messages are sent or received via a transacted session, the trasaction starts, i.e., sent/received messages are grouped as one unit of work.
□when method commit() or method rollbak() is called on the transacted session, the current transaction termnates and a new one is started
□transaction termination affects producers and consumers in the following manner:
 -Producer: that happens to messages sent during the transaction?
   - Commit all grouped messages are effectively sent
   - Rollback all grouped messages are desposed
 -Consumer: that happens to messages received during the transaction?
   - Commit all grouped messages are disposed
   - Rollback all grouped messages are recovered, i.e., they might be received again in the next transaction


ref:
Asynchronous Messaging (★★★☆☆)
http://nsl.epfl.ch/teaching/middleware07/lectures2/jms.pdf

tag : JMS

2009-05-10 15:13 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

JMS/ Sample Codes

■サーバ側の処理: トピックの登録

--addJmsDestination.bat--
call j2eeadmin -addJmsDestination Favorite topic
--/addJmsDestination.bat--

■クライアント側の処理: メッセージのSubscribe(購読予約)

// コネクション生成オブジェクトの取得
TopicConnectionFactory conFactory = (TopicConnectionFactory)
# P2Pの場合は QueueConnectionFactory
jndi.lookup("TopicConnectionFactory");

// JMSサーバとのコネクションを生成
connection = conFactory.createTopicConnection();
# コネクションオブジェクトは、
 JMSクライアントとJMSサーバとの仮想的なコネクションを表すオブジェクトで、
 実際はTCP/IPソケットのコネクションに相当する。

# セッションは、
 メッセージの順番やトランザクションを管理する単位となるもので、
 1コネクションに対して複数のセッションを確立できる。

// 受信処理用セッションの生成
subSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
// コネクション生成オブジェクトの取得
TopicConnectionFactory conFactory = (TopicConnectionFactory)
jndi.lookup("TopicConnectionFactory");

# JMSでは複数スレッドが1セッションオブジェクトを操作指定はいけない。
 →送信処理と受信処理ではスレッドが異なるため、
  別のセッションオブジェクトを生成する必要がある。

// トピックの取得
// "Favorite"はJMSサーバへの登録名と同じにする。
Topic chatTopic = (Topic)
jndi.lookup("Favorite");
// Subscriberオブジェクトの生成
subscriber = subSession.createSubscriber(chatTopic);

# サブスクライバオブジェクトは、
 JMSサーバからのメッセージをリスナオブジェクトに渡すのが仕事。

// 送信処理用セッションの生成
pubSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

// Publisherオブジェクトの生成
publisher = pubSession.createPublisher(chatTopic);

// コネクションの開始
connection.start();

// チャット文字列の送信
TextMessage message = pubSession.createTextMessage();
message.setText(msg);
publisher.publish(message);

# メッセージを受信するとリスナ・オブジェクトのonMessageメソッドが呼ばれる。
public void onMessage(Message message) {
 // メッセージを表示
 TextMessage textMessage = (TextMessage)message;
 try {
  System.out.println(""RCV > "" + textMessage.getText());
 } catch(JMSException ex) {
  ex.printStackTrace();
 }
}

ref:
http://www.smg.co.jp/seminar/JavaNetwork/NP_lecture06.html

tag : JMS

2009-04-16 22:27 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

JMS/ 持続ストレージ

■持続ストレージ
信頼性を支える1側面。

一度持続メッセージが送信先に配信されると、
そのメッセージがコンシューマに配信されるまで、
メッセージサービスが失われないようにすること。

送信先への持続メッセージの配信では、
メッセージサービスが持続メッセージを持続データストアに配置する。

何らかの理由でメッセージサービスが停止した場合、
持続データ格納ではメッセージが修復され、適切なコンシューマに配信される。

→メッセージ配信にオーバーヘッドが発生するが、信頼性は向上する。


□パフォーマンスの兼ね合い
メッセージ配信の信頼性が高い程、
その信頼性を実現する為に、より多くのオーバーヘッドや帯域幅が必要になる。
信頼性とパフォーマンスの兼ね合いは、設計上考慮すべき点。

持続性の無いメッセージのプロデュース/コンシュームする設計で、
最大のパフォーマンスとスループットが得られる。
一方、
処理済セッションを使用するトランザクションでの持続的メッセージをプロデュース/コンシュームで、
最大の信頼性が得られる。

どちらを優先させるかはMQ固有の持続性や通知プロパティの使用、アプリの必要性に寄る。


□メッセージのコンシューム:同期と非同期
JMSクライアントがメッセージをコンシュームする方法は、同期と非同期の2つ。

*同期コンシューム:
クライアントは、MessageCunsumerオブジェクトのreceive()メソッドを呼んでメッセージを取得する。
クライアントスレッドは、メソッドが復帰するまでブロックされる。
→使用可能なメッセージが存在しない場合:
 メッセージが使用可能になるまでクライアントがブロックされるか、
 receive()メソッドがタイムアウトするまでクライアントがブロックされる。
⇒メッセージは、クライアントスレッドによって1つずつのコンシュームされる。

*非同期コンシューム:
クライアントは、メッセージコンシューマにMessageListenerオブジェクトを登録する。
メッセージリスナはコールバックオブジェクトのように機能する。
セッションがMessageListenerオブジェクトのonMessage()メソッドを呼ぶことで、
クライアントがメッセージをコンシュームする。
⇒クライアントスレッドはブロックされず、メッセージが非同期でコンシュームされる。


□メッセージの選択
JMSには、
メッセージセレクタに設定された条件に基づくフィルタや転送を、
メッセージサービスが実行出来るメカニズムがある。
producingClientは、アプリ固有のpropertyをmessageに設定できる。
consumingClientは、設定されたpropertyに基づく選択条件で、メッセージの項目を示すことが出来る。
これにより、クライアントの作業が単純になり、不要なクライアントへの配信メッセージのオーバーヘッドを回避できる。
ただし、
選択条件の処理にオーバーヘッドが発生する。


□メッセージの順番と優先度
一般には、単位のセッションにより送信先に設定された全てのメッセージは、
送信された順にコンシューマへ配信される。
ただし、
別々のpropertyが割り当てられている場合、
メッセージングサービスは、優先度の高いメッセージを先に配信しようとする。



ref:
Sun ONE Message Queue 開発者ガイド (★★★★☆)
http://docs.sun.com/source/816-6459/overview.html#18664

tag : JMS MessageCunsumer MessageListener receive onMessage

2009-04-08 22:19 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

JMS/ Geeting Started with Java Message Service

丁寧で易しい!

【*】イントロ
Remote procedure call (RPC) systems, including Java RMI, are synchronous -- the caller must block and wait until the called method completes execution, and thus offer no potential for developing loosely coupled enterprise applications w/o the use of multiple threads. In other word, RPC systems require the client and the server to be available at the same time. However, such tight coupling may not be possible or desired in some applications.
Message-Oriented Middleware (MOM) systems provide solutions to such problems. They are based on the asynchronous interaction model, and privide the abstraction of a message queue that van be accessed across a network.

RMI等のRPCは同期前提。
呼び出し側が、呼ばれたメソッドの完了を待たないとダメ。
つまり、マルチスレッドなアプリは望み薄。
で、登場するのがJMS
非同期前提。

The Java Message Service (JMS), which is designed under the Java Community Process as JSR914, is the first enterprise messaging API that has received wide industry support. the Java Message Service (JMS) was designed to make it easy to develop business applications that asynchronously send and receive business data and events. it defines a common enterprise messaging API that is designed to be easily and efficiently supported by a wide range of enterprise messaging products. JMS supports both messaging models: point-to-point (queuing) and publish-subscribe.

JMSの送受信モデルは2つ。
PTP(キュー使用)とPub/Sub。

JMS was defined to allow Java application to use enterprise messaging systems. More importantly, it provides a common way for Java applications to access such enterprise messaging systems. JMS falls under middleware, and specifically Message-Oriented Middleware (MOM), which is a relatively low-level of abstraction that runs underneath complementary layers such as database and application adapters, event processing, and business process automation.

JMS defines a set of interfaces and sematics that allow Java applications to communicate with other messaging implementations. A JMSimplementation is known as a JMS provider.

JMSは、インタフェースやらを定義した仕様。
プロバイダと呼ばれる実装部分はベンダーがサポートするもの。


【*】Architecture
A JMS application is composed of the following parts:
- A JMS provider: A messaging system that implements the JMS specification.
-JMS clients: Java applications that send and receive messages.
-Messages: Objects that are used to communicate information b/w JMS clients.
-Administered objects: Preconfigured JMS objects that are created by an administrator for the use of JMS clients.


【*】Message Delivery Models
JMS supports two different message delivery models:
1. Point-to-Point (Queue destination):
in this model, a message is delivered from a producer to one consumer. the Messages are deliveredd to the destination, which is a queue, and then delivered to one of the consumers registered for the queue. While any number of producers can send messages to the queue, each messages is guarateed to be delivered, and consumed by one consumer. If no consumers are registered to consume the messages, the queue holds then until a consumer registers to consume them.

PTPは、(送信側)いっぱい 対 (受信側)いっぱいのうちのどれか1つ。
送信側はメッセージ投げてんけど、受信先が1つも登録されていない場合、
受信先が現れるまでキューがメッセージを保持してる。

2. Publish/Subscribe (Topic destination):
In this model, a message is delivered from a producer to any number of consumers. Messages are delivered to the topic destination, and then to all active consumers who have subscribed to the topic. In addition, any number of producers and send messages to topic destination, and each message can be delibered to any number of subscribers. If there are no consumers registered, the topic destination doesnt hold messages unless it has durable subscription for inactive consumers. A durable subscription represents a consumer registered with the topic destination that can be inactive at the time the messages are sent to the topic.

Pub/Subは、(送信側)いっぱい 対 (受信側)そのトピックを購読登録している全部。


【*】The JMS Programming Model
A JMS application consists of a set of application-defined messages and a set of clients that exchange them. JMS cients interact by sending and receiving messages using the JMS API.
A message is composed of three parts: header, properties, and a body.
+ The header, which is required for every message, contains information that is used for routing and identifying messages. Some of these fields are set automatically, by the JMS provider, suring producing and delivering a message, and others are set by the client on a message by message basis.
+ Properties, which are optional, provide values that clients can use to filter messages. They provide additional information about the data, such as which process created it, the time it was created. Properties can be considered as an extension to the header, and consist of property name/value pairs.
+ The body, which is also aoptional, contains the actual data to be exchaged.
The JMS specification defined six type or classes of messages that a JMS provider must support:
- Message: This represents a message w/o a message body.
- StreamMessage: A message whose body contains a stream of Java primitive types. It is written and read sequentially.
- MapMessage: A message whose body contains a set of name/value pairs. The order of entries is not defined.
- TextMessage: A message whose body contains a Java string... such as an XML message.
- ObjectMessage: A message whose body contains a serialized Java object.
- BytesMessage: A message whose body contains a stream of uninterpreted bytes.

【*】Producing and Consuming Messages
Here are the necessary steps to develop clients to produce and consumer messages.

[Connection Factory] creates [Connection]
[Connection] creates [Session]
[Session] creates [Message Producer], [Message Consumer] and [Message]
[Message Producer] sends to [Destination]
[Message Consumer] receives from [Destination]


【*】Client to Produce Messages
1.
User the Java Naming and Directory Interface (JNDI) to find a ConnectionFactory object, or instantiate a ConnectionFactory object directly and set its attributes.
A client uses a connection factory, which is an instance of either QueueConnectionFactory (point-to-point) or TopicConnectionFactory (publish/subscribe), to create a connection to a provider.
--------------------
Context ctx = new InitialContext();
ConnectionFactory cf1 = (ConnectionFactory) ctx.lookup("jms/QueueConnectionFactory");
ConnectionFactory cf2 = (ConnectionFactory) ctx.lookup("/jms/TopicConnectionFactory");
--------------------
Alternatively, you can directly instantiate a connection factory as follows:
--------------------
ConnectionFactory connFactory = new com.sun.messaging.ConnectionFactory();
--------------------
2.
User the ConnectionFactory object to create a Connection object. this can be done as follows:
--------------------
Connection connection = connFactory.createConnection();
--------------------
Note that you must close all connections you have created. This is done using the Connection.close() method.
3.
Use the Connection object to create one or more Session objects, which provide transactional context with which to group a set of sends and receives into an atomic unit of work. A session can be created as folows:
--------------------
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)
--------------------
The createSession() method takes two arguments: the first means that the session is not transacted, and second means that the session will automatically acknowledge messages when they have been received successfully.
4.
Use JNDI to find Destination object(s), or instantiate one directly and configure it by setting its attributes.
A destination object is used by the client to specify the source of messages it consumes and the target of messages it produces. In the point-to-point messaging, destinations are known as queues, and in the publish/subscribe model of messaging, they are known as topics.
you can lookup the JNDI of a queue named jms/SomeQueue as follows:
--------------------
Destination dest = (Queue) ctx.lookup("jms/SomeQueue");
--------------------
or, you can directly instantiate and configure a destination object as follows:
--------------------
Queue q = new com.sun.messaging.Queue("world");
--------------------
5.
Use a Session and a Destination object to create the needed MessageProducer object, which are used for sending messages to destination. The code below shows how that is done.
Note that you can create a MessageProducer object w/o specifying a Destination object, but in that case a Destination object must be specified for each message produced
--------------------
MessageProducer producer = session.createProducer(SomeQueue OR SomeTopic);
--------------------
Once a producer has been created, it can be used to send messages as follows:
--------------------
producer.send(message);
--------------------


【*】Client to Consume Messages
The first four steps are the same as above.
5.
Use a Session object and a Destination object to create any needed MessageConsumer objects that are used for receiving messages. This can be done as follows:
--------------------
MessageConsumer consumer = session.createConsumer(SomeQueue or SomeTopic);
--------------------
Note that if topic is being used, then you can use the Session.createDurableSubscriber() to durable topic subscriber.
Once the consumer has been created, it can be used to receive messages. Message delivery, however, doesnt begin until you start the connection created eariler, which can be done by calling the start() method:
--------------------
connection.start();
Message msg = consumer.receive();
--------------------
A long parameter can be passed to the receive() method to specify a time-out(ex, 3000L for 3 seconds).
It is important to note that the receive() method is used to consume a message synchronously. In order to consume a message asynchronously, a message listener is used.
6.
If asynchronous communication desired, instantiate a MessageListener object and register it with a MessageConsumer object.
A MessageListener object acts as an asynchronous event handler for messages. The MessageListener interface contains one method, onMessage(), which you implement to receive and process the messages.
In the following snippet of code, the class MyListener implements the MessageListener interface. The message listener is registered with a specific cunsumer using the setMessageListener():
--------------------
MessageListener listener = new My Listener();
consumer.setMessageListener(listener);
--------------------
In order to avoid missing messages, the start() method should be called on the connection after the listener has been regstered. When message delivery begins, the JMS provides automatically invokes the message listener's onMessage() whenever a message is delivered.
7.
Instruct the Connection object to start delivery of messages by calling the start() method.


【*】Sun java System Message Queue 3.5
Sun is one of the principal designers of JMS, and therefore they have been shipping a production implementaion of JMS since 1999.

The Sun Java System Message Queue is a currently shipping produc, which acts as one system for all business messaging needs through support for point-to-point and publish/subscribe messaging models as well as support for synchronous and asynchronous messaging.

Using this product, processes running on different platforms and operating systems can connect to a common Message Queue service to send and receiver information.
Application developers can focus on the business logic of thrie applications rather than the low-level details of how to achieve or implement reliable communication across the network.

This product is a leading business integration enterprise message server that provides a standards-based messaging solution. It is available in two edition: Platform Edition and Enterprise Edition.

-The pratform Edition is both the reference implementation of JMS 1.1 specification as well as product. It is designed for small-scale deployments and development environments. The Platform Edition is included in the J2EE 1.4 reference implementation, and the Sun Java System Application Server Platform Edition 8.
-The Enterprise Edition is a high performance messaging system designed for large-scale enterprise deployments for integrating disparate applications. It includes key enterprise features such as scalability, reliability, and advanced security.

It is worth nothing that the product includes a J2EE 1.4 compliant Resource Adapter that ebables you to use Sun Java System Message Queue as JMS provider for any J2EE 1.4 technology-compliant application server. This enables businesses to maximize their investments in current IT assets by being able to continue using their existing application server, but leverage the benefits of Sun Java System Message Queue.


【*】Synchronous and Asynchronous Message Consumption
A JMS client can consume messages either synchronously or asynchronously.
-Synchronous:
In this mode, a client receives a message by invoking the receive() method of the MessageConsumer object. The application thread blocks until the method returns, and this has the consequence that if a message is not available, it blocks until a message becomes available or the receive() method times out. Also, note that in this model the client can consume one message at a time.
-Asynchronous:
In this mode, the client registers a MessageListener object with a message consumer. This is like a call-back where the client consumes a message when the session invokes the onMessage() method. In other words, the application's method doesn't block.


【*】Reliable Messaging
JMS defines two delivery modes:
1. Persistent messages: Guaranteed to be successfully consumed once and only once. Messages are not lost.
2. Non-persistent messages: Guaranteed to be delivered at most once. Message loss is not a concern.
This, however, is all about performance trade-offs. The more reliable the delivery of messages, the more bandwidth and overhead required to achieve that reliability. Performance can be maximized by producing non-persistent messages, or you can maximize the reliability by producing persisten messages.

For more information on using such advanced feathres, please see Chapter 3 of the J2EE 1.4 Tutorial.
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html


【*】Message-Driven Beans
JMS is a mandatory API and service in J2EE platform. A good example is the message-driven bean, one of a family of EJBs specified in EJB 2.0/2.1. The other two EJBs are session beans and entity beans, which can only be called synchronously.

A JMS Message-Driven Bean (MDB) message consumer that implements the JMS MessageListener interface. The onMessage() method is invoked when a message is received by the MDB container. Note that you do not invoke remote methods on MDBs (like with other enterprise beans) and as a result there are no home or remote interfaces associated with them. It also worth nothing that with J2EE 1.4, MDBs are not limited to JMS; rather, a multiplicity of MDB interfaces can be declared and consumed by application components implementing those interfaces.



ref:
http://java.sun.com/developer/technicalArticles/Ecommerce/jms/

tag : JMS

2009-02-25 23:22 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

INTRO TO JMS

めっちゃ分かり易い!超まとまってる!ミニマム情報のみ!ファーストステップにもってこい!

【*】JMS
Java Messaging Service
a standard java client application programming interface to messaging systems.
third party vendors provide its implementation to support their products.

【*】Messaging System
it provides the means to continue processing while a communcation is pending.
also does an asynchronous way of writing distributed programming.
what this means is that the process sending the message does not block waiing for a response.

contrast this with traditional RPCs in which the caller blocks until counterpart responds.
this is a analogous to leaving a message in an answering machine and going about your business.
conversely, the same analogy for RPC requires counterpart to be abailable to take your call or nothing gets done.

【*】Advantages of Messagaging System
application counterpart does not have to be running.
the sender will proceed uninterrupted and when the receiver begins it will process the message as needed.
the sender and any other components it works with can continue to work despite the non-active state of the receiver.
therefore the system as whole is more resilient to failure.
further, because senders donot connect directly to receivers either one can be easily replaced w/o dsrupting processing.

【*】Further advantages
messaging systems mean existing systems can easily be integrated even if they are written in a language other than java.
because messaging systems do not block they can be added to existing programs w/o affecting existing functionality.
contrast this to adding a RPC call to an existing program.
the modified program will block until the response comes which may never happen if counterpart is down.
thus messaging is the ideal vehicle for application integration if the calling program does not require an immediate response.

【*】Messaging domains
JMS recognizes two basic types: point-to-point and publish-subscribe.
in PTP each message set will be consumed by one and only one application.
in Pub/Sub each message sent can be be received by many applicatons.
note:
PTP: sender and receiver
Pub/Sub: sublisher and subscriber
both: producer and consumer

【*】PTP features
+ each message sent counts so messages should nerver be lost
+ each message is consumed by one and only one receiver
+ message consumers usually must "pull (active)" the messages from the system
+ a typical PTP application is the routing of stock trades to an exchange

【*】Pub/Sub features
+ loss of messages are not critical
+ one sender (publisher) can target many recipients (subscribers)
+ publisher "push" messages whereas subscibers are usually "passive" and just wait for messages to come
+ a typical application is the distribution of stock quotes

【*】Administered objects
messaging systems decouple senders from receivers.
this is accomplished by having producers send messages not to consumers directly but to an external object.
the domain type determines what it is called.
PTP uses the term "queue".
Pub/Sub refers to the object as a "topic".
JMS refers to queues and topics by the generic term "destination."

queues and topics are know as administered objects.

【*】Summary
JMS provides an application programming interface to messaging systems.
messaging systems solve the problem of bottlenecks b/w communicating programs.
PTP domains handle one to one messaging.
Pub/Sub jandles one to many messaging.


ref:
http://www.skillbuilders.com/Tutorials-V2/Java_JMS_Intro/Java_JMS_Intro.cfm

tag : JMS Java Messaging Service RPC PTP Pub/Sub

2009-02-25 00:18 : __j2ee__jms : コメント : 0 : トラックバック : 0 :

JMS

【*】JMS
Java Message Service
メッセージを送ったり受け取ったりするためのAPI
J2EEの1機能

【*】メッセージの送受信方法
2種類
①Point-to-Point(PTP)
②Publish-Subscribe(Pub/Sub)

【*】PTP
送り側はキューに対してメッセージを送信し
受け取り側はそのキューからメッセージを取り出す
取り出されたメッセージはその時点でキューからなくなるので
送り側が送ったメッセージは ただ1つの受け取り側に届く

【*】Pub/Sub
送り側はトピックに対してメッセージを送信
そのメッセージは そのトピックをサブスクライブ(購読)している全てのアプリが受信できる
サブスクライブしている全てのアプリの受信が終わった時点でそのトピックからメッセージが削除される


【*】メッセージ・タイプ
構造化/半構造化メッセージ・タイプ
 ―MapMessage
 ―ObjectMessage
 ―StreamMessage
非構造化/フリーフォーム メッセージ・タイプ
 ―TextMessage
 ―BytesMessage

【*】JMSアプリケーション#コード層
. JMSアプリケーション
  プロバイダに依存しない
  JNDIでJMSを介してプロバイダにアクセスする
. JMSインプリメンテーション
  プロバイダ固有のJMSオブジェクト
. メッセージングプロバイダ
  メッセージングシステム(WebSphere MQ等)

【*】ざっくり
JMSインプリメンテーション層とプロバイダ層の詳細は隠されているため
Java開発者は プロバイダに依存しないJMSアプリを作成可能。
ただし
アプリとプロバイダとを連動できるように構成すること。
つまり
Java開発者は JMSインプリメンテーション層の理解が必須。

【+】WebSphere MQ
メッセージングプロバイダ。
1つ以上のキューマネージャとして稼動。
それぞれのキューマネージャは一連のプロセスで ↓処理を担当。
+キューセットの定義
+キュー内に含まれるメッセージの構成
+メモリ/ディスクでのメッセージの保管
+メッセージングクライアントと他キューマネージャ間のメッセージ転送

※WebSphere MQでは
 パブリッシュ/サブスクライブ・ブローカは
 キューマネージャの起動時に自動的に起動しない。

【*】キューマネージャへの接続方法
+クライアントモード
 エージェントはバインディングモードでキューマネージャと対話しアプリに代わってAPIを呼び出す。
+バインディングモード
 WebSphere MQ固有の接続モード。
 JMSアプリをキューマネージャと同じホストマシンで実行し
 両者をIPC(Inter-Process Communication)プロトコルで通信させる。

【+】クライアントモード
*3ステップ
 ① API呼び出しがクライアントアプリからエージェントに送信される。
 ② エージェントがキューマネージャでその呼び出しを実行する。
 ③ 呼び出し結果あエージェントからクライアントアプリに送信される。
 ※送受信中にネットワークが切断された場合
  クライアントアプリはどのステップで切断されたんか判断付かない。
 ※処理済セッションを使用して、明示的commit()/rollback()メソッドを呼び出すこと推奨
 ※WebSphere MQ/クライアントモードはXAトランザクションNG。
  ライセンス的問題?
 うんぬんぬんぬんん

【+】JMSインプリメンテーション
@WebSphere
 -JMS管理対象オブジェクト
 -管理対象オブジェクトのレジストリ

【+】JMSアプリケーション
JMSアプリケーションスタックの最上位にあるんがJMSアプリ自体。
このアプリはJNDIで必要な各JMS管理対象オブジェクトを参照し
WebSphere MQメッセージング・プロバイダに接続する。
アプリが知らなならんのはリソースのJNDI名だけ。
JNDI名は ケースセンシティブで完全一致してること。

ref:
http://www.hellohiro.com/jmsptp.htm
http://www.ibm.com/developerworks/jp/java/library/j-heterogeneous/
http://www.ibm.com/developerworks/jp/java/websphere/techjournal/0610_woolf/0610_woolf.html

tag : JMS

2009-02-23 22:54 : __j2ee__jms : コメント : 0 : トラックバック : 0 :
ホーム

search

ad



counter


tag cloud

category cloud