参照によって JMS メッセージ・ペイロードを受け渡す理由とその時期
ラージ・オブジェクト・メッセージまたはバイト・メッセージを送信する際、メッセージ・ペイロードのシリアライズ、デシリアライズ、およびコピーのためのメモリーのコストおよびプロセッサー使用量はかなりのものになることがあります。 接続ファクトリーまたはアクティベーション・スペックで「pass message payload by reference」プロパティーを使用可能にする場合は、JMS 1.1 の指定をオーバーライドするようにデフォルト・メッセージング・プロバイダーに通知することで、このデータ・コピーの量が減ったり、行われなくなったりすることがあります。
背景
JMS 1.1 の仕様では、 オブジェクト・メッセージを値によって受け渡すことが示されています。 つまり、WebSphere® Application Server のデフォルト・メッセージング・プロバイダーなどの JMS プロバイダーは、オブジェクトをメッセージ・ペイロードに設定する時点で、クライアント・アプリケーションが設定後にオブジェクトを変更する場合に備えて ObjectMessage にオブジェクトのコピーをとる必要があります。これは、実際にはオブジェクトのシリアライズを意味します。 コピーをとるための完全に安全な方法がほかにないためです。仕様には、 コンシューマー・アプリケーションがメッセージからデータを取得するときに、 JMS プロバイダーはそのデータのコピーを作成して戻す必要があることも示されています。
「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーを有効にすると、 JMS メッセージングでのメモリーの使用とパフォーマンスを改善できる場合があります。
- JMS 仕様の中でこれらのプロパティーが使用しない部分は、メッセージのデータ保全性を確保する目的で定義されています。
- これらのプロパティーを使用する JMS アプリケーションはすべて、 このセクション内で後で詳しく説明するルールに厳密に従う必要があります。 従わない場合には、データ保全性を失うおそれがあります。
- これらのプロパティーを有効にする前に、 このトピックをすべて読んで、理解する必要があります。
- producerDoesNotModifyPayloadAfterSet (接続ファクトリーの場合) または forwarderDoesNotModifyPayloadAfterSet (アクティベーション・スペックの場合)
- このプロパティーを使用可能にすると、接続ファクトリーによって作成されたオブジェクトやバイト・メッセージ、 またはアクティベーション・スペックによって転送されたオブジェクトやバイト・メッセージは、 メッセージへの設定時にはコピーされず、どうしても必要な場合にのみシリアライズされます。 このようなメッセージを送信するアプリケーションは、メッセージにデータを設定した後で、そのデータを変更してはなりません。
- consumerDoesNotModifyPayloadAfterGet
- このプロパティーを使用可能にすると、接続ファクトリーまたはアクティベーション・スペックを使用して受信したオブジェクト・メッセージは、 どうしても必要な場合にのみシリアライズされます。 こうしたメッセージから取得したデータは、アプリケーションにより変更を加えてはなりません。
参照によってメッセージ・ペイロードを受け渡すことによる改善の可能性
- ユーザーの JMS アプリケーションが、 このトピックの次のセクションで説明するルールに準拠している。
- ユーザーのメッセージ・プロデューサーおよびコンシューマー・アプリケーションが、 これらのアプリケーションで使用される宛先をホストしているメッセージング・エンジンと一緒に、同じ JVM (サーバー) で実行されている。
- 各アプリケーションが異なるサーバーまたは z/OS® プラットフォームで実行されている (WebSphere Application Server が複数の JVM で稼働している) 場合には、オブジェクト・メッセージはシリアライズされ、これらのメッセージにおけるパフォーマンスの改善は得られません。その場合にも、バイト・メッセージでの改善は得られる可能性があります。
- メッセージがシリアライズされる可能性がある内部ランタイム条件は数多くあるため、 構成においてこのトピックで説明するすべての条件が満たされても、 「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティー を有効にすることによるパフォーマンスの改善が、ほとんどまたはまったく見られない場合があります。
パフォーマンスの改善可能性の度合い | 構成およびランタイム・イベント | データがコピーされる時点 |
---|---|---|
改善の可能性なし | 「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーは 有効ではありません (デフォルトの動作)。 |
オブジェクト・メッセージ・データは、 メッセージに設定された直後、およびメッセージから取得された時点でコピーされます。 バイト・メッセージ・データは、 メッセージに設定された直後、およびメッセージから取得された時点でコピーされます。 |
一部の改善の可能性 | 「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーは
有効で、以下のいずれかまたは両方の条件が true です。
|
バイト・メッセージ・データは必要なときにのみコピーされます。 |
最大の改善の可能性 | 「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーは
有効で、以下の両方の条件が true です。
|
バイト・メッセージ・データは必要なときにのみコピーされます。 |
JMS アプリケーションが従う必要があるルール
メッセージ・データの保全性を確保するために、「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーによって使用されない JMS 仕様の部分が定義されています。 ユーザーの JMS アプリケーションが次の表に示すルールに従っていれば、 アプリケーションが使用する接続ファクトリーおよびアクティベーション・スペックで「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーを 有効にしても問題はありません。
これらのルールに従っていない JMS アプリケーションで「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーを有効にすると、 アプリケーションが例外を受け取るか、さらに重要なことに、メッセージ・データの保全性が損なわれる場合があります。
アプリケーション・タイプ | 規則 |
---|---|
JMS プロデューサー・アプリケーション | オブジェクト・メッセージを送信する JMS プロデューサー・アプリケーションは、 オブジェクトをメッセージのペイロードに設定した後でそのオブジェクトを変更することはできません。 バイト・メッセージを送信する
JMS プロデューサー・アプリケーションには、以下のルールがあります。
|
JMS コンシューマー・アプリケーション | オブジェクト・メッセージを受信する JMS コンシューマー・アプリケーションは、 メッセージから取得するペイロードを変更することはできません。 |
JMS 転送アプリケーション 注: JMS 転送アプリケーションは、メッセージを (接続ファクトリーを通じて、またはそれがメッセージ駆動型 Bean である場合には、アクティベーション・スペックを通じて) 受信し、そのメッセージ・オブジェクトを別の宛先に送信します。
|
受信したメッセージのペイロードを新規ペイロードによって置換する
JMS 転送アプリケーションには、以下のルールがあります。
|
オブジェクト・メッセージを確実にシリアライズする
通常の JMS メッセージング状態では (つまり、「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーが 有効になっていない場合)、オブジェクトがメッセージング・システムに渡されるとすぐに (set または send などの時点で) オブジェクト・メッセージ内のデータはシリアライズされます。 メッセージ・ペイロードをシリアライズできない場合、即時に例外メッセージがクライアント・アプリケーションに返されます。
「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーが 有効である場合、メッセージ・ペイロードは、シリアライズを試行せずに クライアント・アプリケーションから受け入れられます。後でシステムが データをシリアライズできないことを検出すると、データがシリアライズ不能であるため、 システムは、メッセージを送信したことをクライアント・アプリケーションに通知できなくなり、 完全なメッセージを保持することも、転送することもできません。メッセージとそのプロパティーは保管されますが、 メッセージ (ペイロード) 内のユーザー・データは保管されずに、破棄されます。 システムがメディエーション向けにオブジェクト・メッセージをデータ・グラフに変換しようとしたときに シリアライゼーションの問題が起こると、メッセージ・ペイロードは破棄され、 メディエーションはデータ値がヌルに設定されたメッセージを受け取ります。
データをシリアライズできない場合、 データは失われます。したがって、 先に「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーを有効にせずに 構成をテストして、システムに送信されるすべてのデータがシリアライズ可能であることを確認する必要があります。
- CWSIK0200E: クラス "{0}" のオブジェクトがメッセージ・ペイロードに設定されていますが、 シリアライズできません。
- 説明: 接続ファクトリーで producerDoesNotModifyPayloadAfterSet フラグを有効にして送信されたオブジェクト・メッセージは、システムがシリアライズできなかったペイロードによって送信されました。このメッセージ・データは失われました。
- アクション: 接続ファクトリーで producerDoesNotModifyPayloadAfterSet を無効にします。フラグを有効にしていなければ、オブジェクトをメッセージに設定する JMS アプリケーションは、 何らかのシリアライゼーションの例外を即時に受け取ります。
- JMS_IBM_ExceptionReason
- SIRCConstants.SIRC0200_OBJECT_FAILED_TO_SERIALIZE
- JMS_IBM_ExceptionTimestamp
- オブジェクトのシリアライズに失敗した時点 (System.currentTimeMillis() 形式)。
- JMS_IBM_ExceptionMessage
- 前述のメッセージ CWSIK0200E。
- SI_ExceptionReason
- SIRC0200_OBJECT_FAILED_TO_SERIALIZE
- SI_ExceptionTimestamp
- オブジェクトのシリアライズに失敗した時点 (System.currentTimeMillis() 形式)。
- SI_ExceptionInserts
- 1 つのエントリーを含むストリング配列。このエントリーには、オブジェクトのクラス名が含まれます。