参照によるメッセージ・ペイロードの受け渡し: アプリケーションを転送するための使用シナリオおよびサンプル・コード
JMS 転送アプリケーションは、メッセージを (接続ファクトリーを通じて、またはそれがメッセージ駆動型 Bean である場合には、アクティベーション・スペックを通じて) 受信し、そのメッセージ・オブジェクトを別の宛先に送信します。さまざまな使用シナリオについて検討してから、単一サーバー内のあるキューから別のキューにメッセージを転送する際に、参照によってメッセージ・ペイロードを安全に渡せるように、JMS 転送アプリケーションをコーディングします。
ラージ・オブジェクト・メッセージまたはバイト・メッセージを送信する際、メッセージ・ペイロードのシリアライズ、デシリアライズ、およびコピーのためのメモリーのコストおよびプロセッサー使用量はかなりのものになることがあります。 接続ファクトリーまたはアクティベーション・スペックで「pass message payload by reference」プロパティーを使用可能にする場合は、JMS 1.1 の指定をオーバーライドするようにデフォルト・メッセージング・プロバイダーに通知することで、このデータ・コピーの量が減ったり、行われなくなったりすることがあります。
以下の図では、メッセージング・エンジン上の queue1 からコンシューマーのアクティベーション・スペックまたは接続ファクトリーを介して JMS 転送アプリケーションにメッセージが渡されます。次にこれらのメッセージは、プロデューサーの接続ファクトリーを介して、同じメッセージング・エンジン上の queue2 に転送されます。

- 転送アプリケーションは、メッセージ・オブジェクトを置換しません。これは、ご使用のアプリケーションがメッセージを転送する前に記録 (例えば、印刷) しているときに役立ちます。また、転送されるメッセージでは、JMSCorrelationID、JMSReplyTo、および JMSType プロパティーなどの有益なメッセージ・プロパティーが保存されることを意味します。
- 転送アプリケーションは、メッセージ・ペイロードを変更または置換することができます。ペイロードを置換する場合は、メッセージ・オブジェクトで新規ペイロードを設定し、新規メッセージ・ペイロードを指すようにペイロード参照を変更します。
- 転送アプリケーションでは、転送されるメッセージは、コンシューマーの接続ファクトリーまたはアクティベーション・スペックによって「作成」および構成されます。プロデューサーの接続ファクトリーは、転送されたメッセージを発送するためだけに使用され、転送されるメッセージの内容には影響を及ぼしません。
以下の表に、「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーの設定方法に影響する、転送アプリケーションの使用シナリオを 4 つ示します。 プロデューサーの接続ファクトリーは転送されるメッセージの内容に影響を及ぼさないため、コンシューマー の接続ファクトリーまたはアクティベーション・スペックでコンシューマーのプロパティーとプロデューサー/転送機能のプロパティーの両方を設定することに注意してください。
転送アプリケーションの使用シナリオ | consumerDoesNotModify |
producerDoesNotModify forwarderDoesNotModify |
---|---|---|
シナリオ 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);