参照によるメッセージ・ペイロードの受け渡し: アプリケーションを転送するための使用シナリオおよびサンプル・コード

JMS 転送アプリケーションは、メッセージを (接続ファクトリーを通じて、またはそれがメッセージ駆動型 Bean である場合には、アクティベーション・スペックを通じて) 受信し、そのメッセージ・オブジェクトを別の宛先に送信します。さまざまな使用シナリオについて検討してから、単一サーバー内のあるキューから別のキューにメッセージを転送する際に、参照によってメッセージ・ペイロードを安全に渡せるように、JMS 転送アプリケーションをコーディングします。

ラージ・オブジェクト・メッセージまたはバイト・メッセージを送信する際、メッセージ・ペイロードのシリアライズ、デシリアライズ、およびコピーのためのメモリーのコストおよびプロセッサー使用量はかなりのものになることがあります。 接続ファクトリーまたはアクティベーション・スペックで「pass message payload by reference」プロパティーを使用可能にする場合は、JMS 1.1 の指定をオーバーライドするようにデフォルト・メッセージング・プロバイダーに通知することで、このデータ・コピーの量が減ったり、行われなくなったりすることがあります。

以下の図では、メッセージング・エンジン上の queue1 からコンシューマーのアクティベーション・スペックまたは接続ファクトリーを介して JMS 転送アプリケーションにメッセージが渡されます。次にこれらのメッセージは、プロデューサーの接続ファクトリーを介して、同じメッセージング・エンジン上の queue2 に転送されます。

注意:
JMS 仕様の中のこれらのプロパティーが使用しない部分は、メッセージのデータ保全性を確保する目的で定義されています。 これらのプロパティーを使用するすべての JMS アプリケーションでは、記載されているルールを厳密に守る必要があります。そうしないと、データ保全性が失われる危険性があります。
図 1. メッセージの転送
この図は、1 つのキューから別のキューへのメッセージの流れを表しています。
queue1 からコンシューマー・アクティベーション・スペックまたは接続ファクトリー・プロパティーを介して JMS 転送アプリケーションにメッセージが渡されます。
このメッセージは、次に JMS 転送アプリケーションから、プロデューサーの接続ファクトリー・プロパティーを介して、queue2 へ転送されます。
このトピックで示す使用シナリオおよび関連するサンプル・コードについて理解するには、以下に示す JMS 転送アプリケーションの重要な特性を覚えておく必要があります。
  • 転送アプリケーションは、メッセージ・オブジェクトを置換しません。これは、ご使用のアプリケーションがメッセージを転送する前に記録 (例えば、印刷) しているときに役立ちます。また、転送されるメッセージでは、JMSCorrelationIDJMSReplyTo、および JMSType プロパティーなどの有益なメッセージ・プロパティーが保存されることを意味します。
  • 転送アプリケーションは、メッセージ・ペイロードを変更または置換することができます。ペイロードを置換する場合は、メッセージ・オブジェクトで新規ペイロードを設定し、新規メッセージ・ペイロードを指すようにペイロード参照を変更します。
  • 転送アプリケーションでは、転送されるメッセージは、コンシューマーの接続ファクトリーまたはアクティベーション・スペックによって「作成」および構成されます。プロデューサーの接続ファクトリーは、転送されたメッセージを発送するためだけに使用され、転送されるメッセージの内容には影響を及ぼしません。

以下の表に、「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーの設定方法に影響する、転送アプリケーションの使用シナリオを 4 つ示します。 プロデューサーの接続ファクトリーは転送されるメッセージの内容に影響を及ぼさないため、コンシューマー の接続ファクトリーまたはアクティベーション・スペックでコンシューマーのプロパティーとプロデューサー/転送機能のプロパティーの両方を設定することに注意してください。

表 1. 転送アプリケーションの使用シナリオにおける「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティー設定の効果. 表の最初の列には、4 つの転送アプリケーションの使用シナリオがリストされます。 2 番目の列には、シナリオのコンシューマー・プロパティー設定が示されます。 3 番目の列には、シナリオの接続またはアクティベーション・スペック・プロパティー設定が示されます。
転送アプリケーションの使用シナリオ

consumerDoesNotModify
PayloadAfterGet

のプロパティー設定

producerDoesNotModify
PayloadAfterSet

(接続ファクトリーの場合) または

forwarderDoesNotModify
PayloadAfterSet

(アクティベーション・スペックの場合) のプロパティー設定
シナリオ 1: アプリケーションは、メッセージを受信してペイロードを調べますが、変更しません。また、ペイロードを変更または置換せずにメッセージを転送します。 使用可能 不要だが、使用可能に設定可能
シナリオ 2: アプリケーションは、メッセージを受信してペイロードを調べますが、変更しません。また、メッセージにペイロードを設定する呼び出しの後で、メッセージ内のペイロードを新規ペイロードで置換して、ペイロードを変更せずにメッセージを転送します。 使用可能 使用可能
シナリオ 3: アプリケーションは、メッセージを受信し、ペイロードを調べて変更します。次に、メッセージにペイロードを設定する呼び出しの後で、変更したペイロードまたはその他のデータをメッセージに設定して、ペイロードをこれ以上変更せずにメッセージを転送します。 使用不可 使用可能
シナリオ 4: アプリケーションは、メッセージを受信し、ペイロードを調べて変更します。次に、メッセージにペイロードを設定する呼び出しの後で、変更したペイロードまたはその他のデータをメッセージを設定してから、ペイロードをさらに変更します。 使用不可 使用不可

シナリオ 1、2、および 3 では、転送アプリケーションがこのシナリオで説明されているとおりに動作することを保証できるという条件で、1 つ以上の「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーを使用可能にすることができます。これを行う際に役立つように、以下に、ご使用のアプリケーションでの使用に合わせて調整可能なサンプル・コードをいくつか示します。

転送アプリケーション: シナリオ 1

アプリケーションは、メッセージを受信してペイロードを調べますが、変更しません。また、ペイロードを変更または置換せずにメッセージを転送します。

public void onMessage (Message message)
{
   ObjectMessage oMessage = (ObjectMessage) message;
   DataObject data = oMessage.getObject();
   System.out.print(data.getXXX());
   System.out.print(data.getYYY());

   // get a session to forward on the received message
   
   producer.send(message);
   session.close();
}

転送アプリケーション: シナリオ 2

アプリケーションは、メッセージを受信してペイロードを調べますが、変更しません。また、メッセージにペイロードを設定する呼び出しの後で、メッセージ内のペイロードを新規ペイロードで置換して、ペイロードを変更せずにメッセージを転送します。

public void onMessage (Message message)
{
   ObjectMessage oMessage = (ObjectMessage) message;
   DataObject data = oMessage.getObject();
   System.out.print(data.getXXX());
   System.out.print(data.getYYY());

   // get a session to forward on the received message
   
   message.setObject(newData);

   producer.send(message);
   session.close();
}
バイト・メッセージの場合、アプリケーションは、必ずメッセージに単一のフル・バイト配列のみを書き込むようにしなければなりません。
byte [] data = myByteData; 
BytesMessage message = session.createBytesMessage(); 
message.writeBytes(data); 
data = null;	 
producer.send(message);

転送アプリケーション: シナリオ 3

アプリケーションは、メッセージを受信し、ペイロードを調べて変更します。次に、メッセージにペイロードを設定する呼び出しの後で、変更したペイロードまたはその他のデータをメッセージに設定して、ペイロードをこれ以上変更せずにメッセージを転送します。

public void onMessage (Message message)
{
   ObjectMessage oMessage = (ObjectMessage) message;
   DataObject data = oMessage.getObject();
   System.out.print(data.getXXX());
   System.out.print(data.getYYY());

   // get a session to forward on the received message

   data.setXXX(xxx);
   data.setYYY(yyy);
   message.setObject(data);

   producer.send(message);
   session.close();
}
バイト・メッセージの場合、アプリケーションは、必ずメッセージに単一のフル・バイト配列のみを書き込むようにしなければなりません。
byte [] data = myByteData; 
BytesMessage message = session.createBytesMessage(); 
message.writeBytes(data); 
data = null;	 
producer.send(message);

トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cjn_passbyref_forward
ファイル名:cjn_passbyref_forward.html