WebSphere Message Broker バージョン 8.0.0.5 オペレーティング・システム: AIX、HP-Itanium、Linux、Solaris、Windows、z/OS

製品の最新バージョンについては、IBM Integration Bus バージョン 9.0 をご覧ください。

大規模な入力メッセージを処理して複数の出力メッセージを伝搬する

メッセージのツリー表記は通常、入力ビット・ストリームより大きくなります。 大規模なメッセージ・ツリーの操作には多くのストレージが必要ですが、ブローカーのストレージ・ロードを削減するために役立つ Java™ メソッドをコーディングできます。

入力ビット・ストリームが構文解析され、 論理ツリーが作成されるとき、通常、 対応するビット・ストリームに比べてメッセージのツリー表記の方が大きくなります (場合によっては、 はるかに大きくなります)。
この拡張の理由として次の要因があります。
  • 複数のオブジェクトをリンクするポインターが追加されるため
  • 文字データが Unicode に変換され、サイズが倍加される可能性があるため
  • ビット・ストリームでは暗黙であることの多いフィールド名が含まれるため
  • ブローカーの操作に関連した制御データがあるため

大規模なメッセージ・ツリーの操作には多くのストレージが必要です。 繰り返し構造からなる大規模メッセージを扱うメッセージ・フローを設計する場合、ブローカーのストレージ・ロードを削減するための Java メソッドをコーディングできます。このメソッドはメッセージへのランダム・アクセスと順次アクセスの両方をサポートしますが、一度にメッセージ全体にアクセスする必要がないことを想定します。

このような Java メソッドによって、 ブローカーはメッセージに限定的な構文解析を実行して、単一レコードを表すメッセージ・ツリーのその部分だけを一度にストレージ内に保持します。 処理で 1 つのレコードから次のレコードに移るときに情報を保持しなければならない場合 (例えば、注文に含まれる各品目の繰り返し構造から合計価格を計算する場合)、いくつかの Java 変数を宣言し、初期化して保持することができます。あるいは、メッセージ・ツリー内の他の場所 (例えばローカル環境内) に値を保存する方法もあります。

この技法によって、ブローカーによるメモリーの使用量が減少し、入出力ビット・ストリームの全体と、ただ 1 つのレコードのメッセージ・ツリーを保持するために必要な容量だけが必要になります。 この技法を使えば、メッセージ内での繰り返し回数が少ない場合でもメモリーが節約されます。 ブローカーは限定的に構文解析するだけでよく、 メッセージ・ツリー内の指定された部分だけをビット・ストリームの対応する部分との間で解析します。

JavaCompute ノード (または Java ユーザー定義ノード) でこれらの技法を使用するには、以下のいずれかの手順を実行してください。
  • コピー・コンストラクターを使用して入力 MbMessage をコピーします。 この操作によって、解析されない入力メッセージ、従って最小容量のメモリーしか使用しない入力メッセージの変更可能なコピーが作成されます。
  • 入力メッセージの検査はいっさい行わないようにします。これにより、メッセージを構文解析する必要がなくなります。
  • ループと MbElement 変数を使って、一度に 1 レコードずつメッセージをステップスルーします。 各レコードについて次の処理を実行します。
    • 通常の変換を使用して、対応する出力サブツリーを出力 MbMessage 内に作成します。
    • MbElement.delete() メソッドを使用して、レコード操作完了時に現行入力レコード・メッセージ・ツリーを削除します。
    • 次のコードを使用して、現行レコードの出力メッセージを伝搬します。
      MbOutputTerminal.propagate(MbMessageAssembly, true)
      このプロセスによって、メッセージ・ツリー・リソースとパーサーは、次の出力メッセージ反復でリカバリーと再利用ができます。

実際のメッセージ処理の必要に合わせて、 上記の手法を独自に変えることもできます。

次のサンプル Java コードに、多数の反復レコードを持つ大規模入力メッセージを構文解析する方法を示します。ここで、各レコードは個別の出力メッセージとして伝搬されるものとします。

入力 XMLNSC メッセージは次の形式であり、そこに多数の Record 要素の反復があります。
<TestCase>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  ....
</TestCase>
次に示すサンプル Java コードは、この大規模メッセージを一度に 1 レコード構文解析し、各レコードを伝搬するために使用できます。
//Make a modifiable MbMessage based on the input message passed in on the inAssembly.
MbMessage clonedInMessage = new MbMessage(inAssembly.getMessage());
//Now partially parse the cloned input message one record at a time.
MbElement inputRootElement = clonedInMessage.getRootElement();
MbElement inputPropertiesElement = inputRootElement.getFirstElementByPath("Properties");
MbElement inputMQMDElement = inputRootElement.getFirstElementByPath("MQMD");
MbElement inputXMLNSCElement = inputRootElement.getFirstElementByPath("XMLNSC");

MbElement inputXMLNSCRootTagElement = inputXMLNSCElement.getFirstChild(); //Move to the TestCase tag
MbElement currentInputRecord = inputXMLNSCRootTagElement.getFirstChild(); //Move to the Record tag

while(currentInputRecord != null)
{
  // Create a new output message for the record that we are going to be propagate.
  MbMessage outputMessage = new MbMessage();
  MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outputMessage);

  //Create new parsers folders in the output message.
  MbElement outputRootElement = outputMessage.getRootElement();
  MbElement outputPropertiesElement = outputRootElement.createElementAsLastChild(inputPropertiesElement.getParserClassName());
  MbElement outputMQMDElement = outputRootElement.createElementAsLastChild(inputMQMDElement.getParserClassName());
  MbElement outputXMLNSCElement = outputRootElement.createElementAsLastChild(inputXMLNSCElement.getParserClassName());       
  //Create the root tag in the output XMLNSC folder that will be used for this output record.
  MbElement outputXMLNSCRootTag = outputXMLNSCElement.createElementAsLastChild(MbElement.TYPE_NAME, "TestCase", null);
  //Create the record tag for this output message instance.
  MbElement currentOutputRecord = outputXMLNSCRootTag.createElementAsLastChild(MbElement.TYPE_NAME, "Record", null);

  //Copy the Properties Folder, MQMD header, and the current record.
  outputPropertiesElement.copyElementTree(inputPropertiesElement);
  outputMQMDElement.copyElementTree(inputMQMDElement);
  currentOutputRecord.copyElementTree(currentInputRecord);   

  //Propagate this message, requesting that the output message assembly be cleared after propagation.
  out.propagate(outAssembly, true);
  //Note: You do not need to call clearMessage on outputMessage because it was cleared after the propagation.

  //Take a reference to the current record so that it can be deleted.
  MbElement previousInputRecord = currentInputRecord;
  //Now move to the next input record ready for processing.
  currentInputRecord = currentInputRecord.getNextSibling();
  //Now that we have moved to the next sibling, delete the input record that has already been processed.
  previousInputRecord.delete();

}
この Java コードによって、次の入力 XMLNSC メッセージ内の各反復 Record サブツリーに対するメッセージが生成されます。
<Record>
  <Field1>A</Field1>
  <Field2>B</Field2>
  <Field3>C</Field3>
  <Field4>D</Field4>
  <Field5>E</Field5>
</Record>
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        最終更新:
        
        最終更新: 2015-02-28 17:48:38


タスク・トピックタスク・トピック | バージョン 8.0.0.5 | bc23802_