参照によるメッセージ・ペイロードの受け渡し: 処理ステップごとの考えられる利点
JMS メッセージング・アプリケーションで行われる処理ステップごとに、関連する接続ファクトリーまたはアクティベーション・スペックで「参照によるメッセージ・ペイロードの受け渡し」プロパティーを使用可能にした場合に得られる可能性があるパフォーマンス上の利点について、そのタイミングと理由をこの表で確認してください。
ラージ・オブジェクト・メッセージまたはバイト・メッセージを送信する際、メッセージ・ペイロードのシリアライズ、デシリアライズ、およびコピーのためのメモリーのコストおよびプロセッサー使用量はかなりのものになることがあります。 接続ファクトリーまたはアクティベーション・スペックで「pass message payload by reference」プロパティーを使用可能にする場合は、JMS 1.1 の指定をオーバーライドするようにデフォルト・メッセージング・プロバイダーに通知することで、このデータ・コピーの量が減ったり、行われなくなったりすることがあります。
注意:
JMS 仕様の中のこれらのプロパティーが使用しない部分は、メッセージのデータ保全性を確保する目的で定義されています。 これらのプロパティーを使用するすべての JMS アプリケーションでは、トピック『参照による JMS メッセージ・ペイロードの受け渡す理由とタイミング』に記載されているルールを厳密に守る必要があります。
そうしないと、データ保全性が失われる危険性があります。
参照によってメッセージ・ペイロードを渡すには、
接続ファクトリーおよびアクティベーション・スペックで次のプロパティーを設定します。
- producerDoesNotModifyPayloadAfterSet (接続ファクトリーの場合) または forwarderDoesNotModifyPayloadAfterSet (アクティベーション・スペックの場合)
- このプロパティーを使用可能にすると、接続ファクトリーによって作成されたオブジェクトやバイト・メッセージ、 またはアクティベーション・スペックによって転送されたオブジェクトやバイト・メッセージは、 メッセージへの設定時にはコピーされず、どうしても必要な場合にのみシリアライズされます。 このようなメッセージを送信するアプリケーションは、メッセージにデータを設定した後で、そのデータを変更してはなりません。
- consumerDoesNotModifyPayloadAfterGet
- このプロパティーを使用可能にすると、接続ファクトリーまたはアクティベーション・スペックを使用して受信したオブジェクト・メッセージは、 どうしても必要な場合にのみシリアライズされます。 こうしたメッセージから取得したデータは、アプリケーションにより変更を加えてはなりません。
処理ステップ | パフォーマンスの向上の可能性の有無 | 説明 |
---|---|---|
プロデューサーおよびコンシューマー・アプリケーションを使用するオブジェクト・メッセージ | ||
オブジェクト・メッセージは、同じ JVM 内のコンシューマー・アプリケーションに送信されます。producerDoesNotModifyPayloadAfterSet と consumerDoesNotModifyPayloadAfterGet の両方のプロパティーが使用可能になっています。 | はい | 一定の条件下では、ペイロード・オブジェクトは、参照によってコンシューマー・アプリケーションに渡されます。 メッセージが非パーシスタントまたはトランザクションの場合は、コンシューマー・アプリケーションは即時に使用可能になり、ペイロード・オブジェクトはシリアライズされないことがあります。 |
オブジェクト・メッセージは、producerDoesNotModifyPayloadAfterSet プロパティーを使用可能にして生成され、次に consumerDoesNotModifyPayloadAfterGet プロパティーが使用可能になっていないコンシューマー・アプリケーションによって受信されます。 | いいえ | コンシューマー・アプリケーションでは consumerDoesNotModifyPayloadAfterGet プロパティーが使用可能になっていないため、利点は得られません。 |
オブジェクト・メッセージは、異なる JVM 内の単一のコンシューマー・アプリケーションに送信されます。producerDoesNotModifyPayloadAfterSet と consumerDoesNotModifyPayloadAfterGet の両方のプロパティーが使用可能になっています。 | いいえ | 単一のコンシューマー・アプリケーションは別の JVM 内にあるため、利点は得られません。 |
オブジェクト・メッセージは、すべてで consumerDoesNotModifyPayloadAfterGet プロパティーが使用可能になっており、同じ JVM 内で実行されている複数のコンシューマー・アプリケーションによって受信されます。 | はい | consumerDoesNotModifyPayloadAfterGet プロパティーが使用可能になっているすべてのコンシューマー・アプリケーションが、同じオブジェクトへの参照を受け取る可能性がありますが、これは保証されません。 |
転送機能アプリケーションを使用するオブジェクト・メッセージ | ||
オブジェクト・メッセージが転送され、転送機能アプリケーションはメッセージのペイロードにアクセスします。consumerDoesNotModifyPayloadAfterGet と producer/forwarderDoesNotModifyPayloadAfterSet のプロパティーが使用可能になっています。 | はい | 以下の場合に、パフォーマンス上の利点が得られる可能性があります。
|
オブジェクト・メッセージが転送され、転送機能アプリケーションはメッセージのペイロードにアクセスします。producer/forwarderDoesNotModifyPayloadAfterSet プロパティーのみが使用可能になっています。 | はい | 転送されるメッセージのコンシューマーで consumerDoesNotModifyPayloadAfterGet プロパティーが使用可能になっており、このコンシューマーが転送機能アプリケーションと同じ JVM にある場合は、パフォーマンス上の利点を得られる可能性があります。 |
オブジェクト・メッセージが転送され、転送機能アプリケーションはメッセージのペイロードにアクセスしません。 | いいえ | オブジェクト・メッセージのペイロードが転送機能アプリケーションによってアクセスされない場合は、producer/forwarderDoesNotModifyPayloadAfterSet と consumerDoesNotModifyPayloadAfterGet のプロパティーは転送機能アプリケーションで影響を与えません。元のプロデューサー・アプリケーションおよび最終的なコンシューマー・アプリケーションから得られる利点はそのままです。 |
メディエーションを使用するオブジェクト・メッセージ | ||
オブジェクト・メッセージは、仲介されたサービス統合バス宛先に送信されます。 | いいえ | オブジェクト・メッセージが仲介された宛先に送信される場合は、producerDoesNotModifyPayloadAfterSet プロパティーを使用可能にすることによって得られるパフォーマンス上の利点はありません。 |
コンシューマー・アプリケーションを使用するバイト・メッセージ | ||
バイト・メッセージは、任意のコンシューマー・アプリケーションに送信されます。 producerDoesNotModifyPayloadAfterSet プロパティーが使用可能になっています。 | はい | メッセージへの設定時にデータをコピーしなければならない JMS 仕様の部分はバイパスされ、バイト・データのコピーが保存されます。 |
バイト・メッセージは、consumerDoesNotModifyPayloadAfterGet プロパティーが使用可能にされて受信されます。 | いいえ | JMS API では、バイト・データを参照によってコンシューマー・コード (BytesMessage.readBytes メソッド) に渡して戻すことはできません。 |
バイト・メッセージは、すべてで consumerDoesNotModifyPayloadAfterGet プロパティーが使用可能になっている複数のコンシューマー (トピック) によって受信されます。 | いいえ | JMS API では、バイト・データを参照によってコンシューマー・コード (BytesMessage.readBytes メソッド) に渡して戻すことはできません。 |
転送機能アプリケーションを使用するバイト・メッセージ | ||
バイト・メッセージは転送されます。 | いいえ | いずれかの「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーを使用可能にすることで得られる利点はありません。 |