参照によるメッセージ・ペイロードの受け渡し: プロデューサーおよびコンシューマー・アプリケーションのサンプル・コード
単一サーバー内のプロデューサーおよびコンシューマー・アプリケーション間の非同期メッセージングを行うために参照によってメッセージ・ペイロードを安全に渡せるように、JMS アプリケーションをコーディングします。
ラージ・オブジェクト・メッセージまたはバイト・メッセージを送信する際、メッセージ・ペイロードのシリアライズ、デシリアライズ、およびコピーのためのメモリーのコストおよびプロセッサー使用量はかなりのものになることがあります。 プロデューサー・アプリケーションとコンシューマー・アプリケーションが同じ JVM にあり、 関連付けられている接続ファクトリーおよびアクティベーション・スペックで「pass message payload by reference」プロパティーを使用可能にする場合は、メッセージ・ペイロードをプロデューサー・アプリケーションからコンシューマー・アプリケーションへの参照によって渡すことができます。 これにより、データ・コピーの量が減ったり、行われなくなったりすることで、パフォーマンスおよびメモリーの使用状況が改善されることがあります。
以下の図では、JMS プロデューサー・アプリケーションからプロデューサー接続ファクトリーを介してメッセージング・エンジン上のキューにメッセージが渡されます。 その後、これらのメッセージは、キューから取り出され、コンシューマーの接続ファクトリーまたはアクティベーション・スペックを介して JMS コンシューマー・アプリケーションに渡されます。
注意:
JMS 仕様の中のこれらのプロパティーが使用しない部分は、メッセージのデータ保全性を確保する目的で定義されています。 これらのプロパティーを使用するすべての JMS アプリケーションでは、記載されているルールを厳密に守る必要があります。そうしないと、データ保全性が失われる危険性があります。
図 1. メッセージの生成および消費

プロデューサーの接続ファクトリーの 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());
}