参照によって 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
このプロパティーを使用可能にすると、接続ファクトリーまたはアクティベーション・スペックを使用して受信したオブジェクト・メッセージは、 どうしても必要な場合にのみシリアライズされます。 こうしたメッセージから取得したデータは、アプリケーションにより変更を加えてはなりません。

参照によってメッセージ・ペイロードを受け渡すことによる改善の可能性

次の表に、 「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」 プロパティーを有効にすることでパフォーマンスの改善を得られる条件を示します。 この表では、以下のことを前提としています。
  • ユーザーの JMS アプリケーションが、 このトピックの次のセクションで説明するルールに準拠している。
  • ユーザーのメッセージ・プロデューサーおよびコンシューマー・アプリケーションが、 これらのアプリケーションで使用される宛先をホストしているメッセージング・エンジンと一緒に、同じ JVM (サーバー) で実行されている。
注:
  • 各アプリケーションが異なるサーバーまたは z/OS® プラットフォームで実行されている (WebSphere Application Server が複数の JVM で稼働している) 場合には、オブジェクト・メッセージはシリアライズされ、これらのメッセージにおけるパフォーマンスの改善は得られません。その場合にも、バイト・メッセージでの改善は得られる可能性があります。
  • メッセージがシリアライズされる可能性がある内部ランタイム条件は数多くあるため、 構成においてこのトピックで説明するすべての条件が満たされても、 「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティー を有効にすることによるパフォーマンスの改善が、ほとんどまたはまったく見られない場合があります。
表 1. コピーするデータ、コピーする時点、およびパフォーマンスの改善の可能性が、構成およびランタイム要因によって決定される方法. 最初の列には、パフォーマンスの改善可能性の度合いがリストされます。 2 番目の列には、改善可能性の構成およびランタイム・イベントが示されます。 3 番目の列には、改善可能性の構成およびランタイム・イベントに基づいて、どのデータがコピーされるか、およびいつデータがコピーされるかなどの情報が示されます。
パフォーマンスの改善可能性の度合い 構成およびランタイム・イベント データがコピーされる時点
改善の可能性なし

「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーは 有効ではありません (デフォルトの動作)。

オブジェクト・メッセージ・データは、 メッセージに設定された直後、およびメッセージから取得された時点でコピーされます。

バイト・メッセージ・データは、 メッセージに設定された直後、およびメッセージから取得された時点でコピーされます。

一部の改善の可能性
「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーは 有効で、以下のいずれかまたは両方の条件が true です。
  • 送信または受信メッセージが処理されている。
  • コンシューマーが、メッセージの作成時に使用できない。

[AIX Solaris HP-UX Linux Windows][IBM i]オブジェクト・メッセージ・データは必要なときにのみコピーされます。

バイト・メッセージ・データは必要なときにのみコピーされます。

最大の改善の可能性
「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーは 有効で、以下の両方の条件が true です。
  • 送信メッセージも受信メッセージも処理されていない。
  • コンシューマーがメッセージの作成時にそのメッセージを待っている (例えば、コンシューマーがメッセージ駆動型 Bean の場合)。

[AIX Solaris HP-UX Linux Windows][IBM i]オブジェクト・メッセージ・データはコピーされない可能性があります。

バイト・メッセージ・データは必要なときにのみコピーされます。

JMS アプリケーションが従う必要があるルール

メッセージ・データの保全性を確保するために、「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーによって使用されない JMS 仕様の部分が定義されています。 ユーザーの JMS アプリケーションが次の表に示すルールに従っていれば、 アプリケーションが使用する接続ファクトリーおよびアクティベーション・スペックで「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーを 有効にしても問題はありません。

これらのルールに従っていない JMS アプリケーションで「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーを有効にすると、 アプリケーションが例外を受け取るか、さらに重要なことに、メッセージ・データの保全性が損なわれる場合があります。

表 2. JMS アプリケーションが従う必要があるルール (アプリケーション・タイプ別). 最初の列には、JMS アプリケーション・タイプがリストされます。 2 番目の列には、JMS アプリケーションが従う必要があるルールが示されます。
アプリケーション・タイプ 規則
JMS プロデューサー・アプリケーション

オブジェクト・メッセージを送信する JMS プロデューサー・アプリケーションは、 オブジェクトをメッセージのペイロードに設定した後でそのオブジェクトを変更することはできません。

バイト・メッセージを送信する JMS プロデューサー・アプリケーションには、以下のルールがあります。
  • writeBytes(byte[]) への 1 回の呼び出しでデータをメッセージに書き込まなければなりません。
  • バイト配列をメッセージに書き込んだ後でその配列を変更することはできません。
JMS コンシューマー・アプリケーション

オブジェクト・メッセージを受信する JMS コンシューマー・アプリケーションは、 メッセージから取得するペイロードを変更することはできません。

JMS 転送アプリケーション
注: JMS 転送アプリケーションは、メッセージを (接続ファクトリーを通じて、またはそれがメッセージ駆動型 Bean である場合には、アクティベーション・スペックを通じて) 受信し、そのメッセージ・オブジェクトを別の宛先に送信します。
受信したメッセージのペイロードを新規ペイロードによって置換する JMS 転送アプリケーションには、以下のルールがあります。
  • (オブジェクト・メッセージの場合)。 オブジェクトをメッセージのペイロードに設定した後でそのオブジェクトを変更することはできません。
  • (バイト・メッセージの場合):
    • writeBytes(byte[]) への 1 回の呼び出しでデータをメッセージに書き込まなければなりません。
    • バイト配列をメッセージに書き込んだ後でその配列を変更することはできません。

オブジェクト・メッセージを確実にシリアライズする

通常の JMS メッセージング状態では (つまり、「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーが 有効になっていない場合)、オブジェクトがメッセージング・システムに渡されるとすぐに (set または send などの時点で) オブジェクト・メッセージ内のデータはシリアライズされます。 メッセージ・ペイロードをシリアライズできない場合、即時に例外メッセージがクライアント・アプリケーションに返されます。

「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーが 有効である場合、メッセージ・ペイロードは、シリアライズを試行せずに クライアント・アプリケーションから受け入れられます。後でシステムが データをシリアライズできないことを検出すると、データがシリアライズ不能であるため、 システムは、メッセージを送信したことをクライアント・アプリケーションに通知できなくなり、 完全なメッセージを保持することも、転送することもできません。メッセージとそのプロパティーは保管されますが、 メッセージ (ペイロード) 内のユーザー・データは保管されずに、破棄されます。 システムがメディエーション向けにオブジェクト・メッセージをデータ・グラフに変換しようとしたときに シリアライゼーションの問題が起こると、メッセージ・ペイロードは破棄され、 メディエーションはデータ値がヌルに設定されたメッセージを受け取ります。

データをシリアライズできない場合、 データは失われます。したがって、 先に「参照によるメッセージ・ペイロードの受け渡し (pass message payload by reference)」プロパティーを有効にせずに 構成をテストして、システムに送信されるすべてのデータがシリアライズ可能であることを確認する必要があります。

システムは、オブジェクト・メッセージをシリアライズできないことを検出すると、 次のエラー・メッセージ (JMS_IBM_ExceptionMessage) を SystemOut.log ファイルに書き込みます。 この "{0}" は、失敗したオブジェクトのクラス名に置き換えられます。
注: このトピックでは、 1 つ以上のアプリケーション・サーバー・ログ・ファイルを参照します。推奨される代替案として、分散システムや IBM® i システムの SystemOut.logSystemErr.logtrace.logactivity.log ファイルではなく、High Performance Extensible Logging (HPEL) ログおよびトレース・インフラストラクチャーを使用するようにサーバーを構成できます。また HPEL は、ネイティブ z/OS ロギング機能と連携させて使用することができます。HPEL を使用する場合、LogViewer コマンド・ライン・ツールを サーバー・プロファイルの bin ディレクトリーから使用して、すべてのログ・ファイルにアクセスし、 情報をトレースできます。HPEL の使用について詳しくは、HPEL を使用してのアプリケーションの トラブルシューティングに関する情報を参照してください。
CWSIK0200E: クラス "{0}" のオブジェクトがメッセージ・ペイロードに設定されていますが、 シリアライズできません。
説明: 接続ファクトリーで producerDoesNotModifyPayloadAfterSet フラグを有効にして送信されたオブジェクト・メッセージは、システムがシリアライズできなかったペイロードによって送信されました。このメッセージ・データは失われました。
アクション: 接続ファクトリーで producerDoesNotModifyPayloadAfterSet を無効にします。フラグを有効にしていなければ、オブジェクトをメッセージに設定する JMS アプリケーションは、 何らかのシリアライゼーションの例外を即時に受け取ります。
データ・オブジェクトがシリアライズできず、破棄されたことを示すために、以下の例外プロパティーが使用されます。JMS アプリケーションは、 発生した内容を JMS_IBM_Exception プロパティーで確認できます。 メディエーションは、発生した内容を JMS_IBM_Exception および SI_Exception プロパティーで確認できます。
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 つのエントリーを含むストリング配列。このエントリーには、オブジェクトのクラス名が含まれます。
注: データ・オブジェクトをシリアライズできない理由の説明としては、 独自の writeObject() または writeExternal() メソッドが作成されていて、 すべてのオプションが完全にテストされていない (例えば、NullPointer 例外や ArrayIndexOutOfBounds 例外など) ことが考えられます。

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



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