参照によるメッセージ・ペイロードの受け渡し: プロデューサーおよびコンシューマー・アプリケーションのサンプル・コード

単一サーバー内のプロデューサーおよびコンシューマー・アプリケーション間の非同期メッセージングを行うために参照によってメッセージ・ペイロードを安全に渡せるように、JMS アプリケーションをコーディングします。

ラージ・オブジェクト・メッセージまたはバイト・メッセージを送信する際、メッセージ・ペイロードのシリアライズ、デシリアライズ、およびコピーのためのメモリーのコストおよびプロセッサー使用量はかなりのものになることがあります。 プロデューサー・アプリケーションとコンシューマー・アプリケーションが同じ JVM にあり、 関連付けられている接続ファクトリーおよびアクティベーション・スペックで「pass message payload by reference」プロパティーを使用可能にする場合は、メッセージ・ペイロードをプロデューサー・アプリケーションからコンシューマー・アプリケーションへの参照によって渡すことができます。 これにより、データ・コピーの量が減ったり、行われなくなったりすることで、パフォーマンスおよびメモリーの使用状況が改善されることがあります。

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

注意:
JMS 仕様の中のこれらのプロパティーが使用しない部分は、メッセージのデータ保全性を確保する目的で定義されています。 これらのプロパティーを使用するすべての JMS アプリケーションでは、記載されているルールを厳密に守る必要があります。そうしないと、データ保全性が失われる危険性があります。
図 1. メッセージの生成および消費
この図は、JMS プロデューサー・アプリケーションからメッセージング・エンジン上のキューへのメッセージのフローを説明します。
次に、これらのメッセージは、コンシューマー接続ファクトリーまたはアクティベーション・スペック・プロパティーを介して JMS コンシューマー・アプリケーションに渡されます。
プロデューサーの接続ファクトリーの producerDoesNotModifyPayloadAfterSet プロパティーを使用可能にしている場合は、ご使用のプロデューサー・アプリケーションは、オブジェクトまたはバイト・メッセージに設定された後のペイロード・オブジェクトを変更しないことを保証する必要があります。これを行う際に役立つように、以下に、ご使用のアプリケーションでの使用に合わせて調整可能なサンプル・コードをいくつか示します。
DataObject data = new DataObject(); 
data.setXXX("xxx"); 
data.setYYY(yyy); 
ObjectMessage message = session.createObjectMessage(); 
message.setObject(data); 
data = null; 
producer.send(message); 
バイト・メッセージでは、ご使用のプロデューサー・アプリケーションがメッセージに書き込むのは単一のフル・バイト配列のみであることを保証する必要があります。これを行う際に役立つように、以下に、ご使用のアプリケーションでの使用に合わせて調整可能なサンプル・コードをいくつか示します。
byte [] data = myByteData; 
BytesMessage message = session.createBytesMessage(); 
message.writeBytes(data); 
data = null;	 
producer.send(message);
コンシューマーの接続ファクトリーまたはアクティベーション・スペックの consumerDoesNotModifyPayloadAfterGet プロパティーを使用可能にしている場合は、ご使用のコンシューマー・アプリケーションは、オブジェクト・メッセージから取得したペイロードを変更しないことを保証する必要があります (バイト・メッセージの消費は、consumerDoesNotModifyPayloadAfterGet プロパティーの影響を受けません)。これを行う際に役立つように、以下に、ご使用のアプリケーションでの使用に合わせて調整可能なサンプル・コードをいくつか示します。
public void onMessage (Message message)
{
   ObjectMessage oMessage = (ObjectMessage) message;
   DataObject data = oMessage.getObject();
   System.out.print(data.getXXX());
   System.out.print(data.getYYY());
}

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



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