ユーザー定義のメッセージ処理ノードの計画

このトピックは、正しく機能するようにメッセージ処理ノードを作成する方法を説明します。 メッセージ処理ノードを使用してメッセージをナビゲートする方法についても説明します。

設計上の考慮事項

メッセージ処理ノードの開発およびインプリメント前に、次のことを決定する必要があります。
  • メッセージを解析するメッセージ・パーサー
  • このメッセージ処理ノードに合わせたデフォルト・メッセージ・パーサー属性をオーバーライドするかどうか
  • メッセージ処理ノードの適切なスレッド化モデル
  • ノードがサポートするメッセージ処理およびトランザクション・サポートの終了
  • メッセージ・フロー・デザイナーによる変更のために外部化 するべきメッセージ処理ノードが必要とする構成属性。
  • ユーザー定義の API が提供するオプションのノード API
  • 開発上の一般的考慮事項は次のとおりです。

構文エレメント・ナビゲーション

ブローカー・インフラストラクチャーは、 メッセージのツリー表記を全探索するメッセージ処理ノードをインプリメントできるようにするための関数を提供します。 この関数およびメソッドにより、現行のエレメントからそのエレメントの以下のものへナビゲーションできるようにします。
  • 最初の子
  • 最後の子
  • 直前の (または左の) 兄弟
  • 次の (または右の) 兄弟
これは下の図に示されています。 他の関数およびメソッドがエレメント自体の操作をサポートします。 これには、エレメントを作成したり、エレメントの値を設定また照会したり、ツリーに新しいエレメントを挿入したり ツリーからエレメントを除去したりする関数やメソッドが含まれます。 詳細については、C ノード・ユーティリティー関数およびC パーサー・ユーティリティー関数、 または Javadoc を参照してください。

他のエレメントへの接続がある構文エレメント


この図は構文エレメントを示す。これは他のエレメントに接続されている。他のエレメント: 直前の兄弟および 次の兄弟がエレメントの左と右、最初の子および最後の子がエレメントの下、親はエレメントの上。
次の図は、エレメント間の相互接続の全範囲を示す、単純な構文エレメント・ツリーです。

構文エレメント・ツリー


この図は構文エレメント・ツリーを示す。エレメント A が図の先頭、エレメント B の上にあり、B は 同じレベルにあるエレメント C、D、および E の上にある。

エレメント A がツリーのルート・エレメント です。 これがルートであるため、これには親がありません。エレメント A はエレメント B最初の子 として持っています。A には他の子がないため、 エレメント BA最後の子 でもあります。

エレメント B は 3 つの子: エレメント CD、 および E があります。 エレメント CB最初の子、 エレメント EB最後の子 です。

エレメント C には 2 つの兄弟: エレメント D および E があります。エレメント C次の兄弟 は エレメント D です。エレメント D次の兄弟 は エレメント E です。エレメント E直前の兄弟 は エレメント D です。エレメント D直前の兄弟 は エレメント C です。

下の図は、WebSphere Message Broker が受信する典型的なメッセージの構文エレメントの最初の生成を示します。(すべての メッセージに MQRFH2 ヘッダーがあるわけではないことに注意してください。)

典型的なメッセージでの構文エレメントの最初の生成


図の先頭に、ルートというボックスがある。線がこのボックスを、左下のプロパティーとマークされた ボックスに接続し、別の線が右下の XML とマークされたボックスに接続している。 これら 2 つのボックスの間に、さらに 2 つの、MQMD および  MQRFH2 とマークされたボックスがある。

最初の生成におけるこれらのエレメントは、しばしば「フォルダー」と呼ばれ、 この中にメッセージ・ヘッダーおよびメッセージ内容のデータを表す構文エレメントが保管されています。 この例では、ルートの最初の子はプロパティー・フォルダーです。 プロパティー の次の兄弟が WebSphere MQ 着信メッセージの MQMD のフォルダーです。その次の 兄弟が MQRFH2 ヘッダーのフォルダーです。最後に、(この例では) XML メッセージであるメッセージ内容を表す フォルダーがあります。

上の図には MQMD および MQRFH2 ヘッダーが含まれています。 MQmessage 処理ノードによって受信されるすべてのメッセージには MQMD ヘッダーが含まれ、 他にも含めることのできるヘッダーがいくつかあります。

XML メッセージのナビゲーション

次の XML メッセージがあるとします。
  <Business>
    <Product type='messaging'></Product>
    <Company>
      <Title>IBM</Title>
      <Location>Hursley</Location>
      <Department>WebSphere MQ</Department>
    </Company>
  </Business>
この例では、エレメントは以下のタイプです。
名前エレメント
Business、Product、Company、Title、Location、Department
値エレメント
IBM、Hursley、WebSphere MQ
名前値エレメント
type='messaging'

メッセージをナビゲートするには、ノード・ユーティリティー関数およびメソッド (または類似のパーサー・ユーティリティー関数) を使用できます。 上記の XML メッセージでは、まず cniRootElement を、 ノードがこの関数への入力として受信したメッセージと共に呼び出す必要があります。 Java では、 着信の MbMessagegetRootElement を呼び出す必要があります。 これは、エレメントのルートを表す MbElement を戻します。 ルート・エレメントをユーザー定義ノードで変更するべきではありません。

上の図は、ルート・エレメントの最後の子が XML 構文解析ツリーを含むフォルダーであることを示しています。 このフォルダーにナビゲートするには、C ノードで cniLastChild (この直前のコールの出力をこの関数の入力として) を呼び出すか、 あるいは Java ノード内でメソッド getLastChild をルート・エレメントに対して呼び出します。

メッセージの最上位には、1 つだけエレメント (<Business>) があるので、 cniFirstChild (Cで) または getFirstChild (Java で) を呼び出すとツリーのこの点に移動します。 cniElementType または getElementType を使用してそのタイプ (name) を入手し、 その後に cniElementName または getName と続けて名前自体 (Business) を戻すことができます。

<Business> には 2 つの子、<Product> および <Company> があるので、cniFirstChild または getFirstChildcniNextSibling または getNextSibling と続けて、それらへ順にナビゲートできます。

<Product> には属性 (type='messaging') があり、 これは子エレメントです。このエレメントへナビゲートするには cniFirstChild または getFirstChild を再度使用し、cniElementType または getType を使用してそのタイプ (name-value) を戻します。名前を得るには前と同じように、cniElementName または getName を使用します。値を 入手するには、cniElementValueType を呼び出してタイプを戻し、それに cniElementValue グループの 中の適切な関数を続けます。この例では、これは cniElementCharacterValue です。 Java では、メソッド getValue を使用するとこれにより、そのエレメント値を表す Java オブジェクトが戻されます。

<Company> には 3 つの子があり、それぞれに値エレメントである子 (IBMHursley、および WebSphere MQ) があります。すでに説明された関数を使用してこれらにナビゲートしこれらの値にアクセスできます。

他の関数が、エレメント・ツリー (またはその一部) をコピーするために使用可能です。 そのコピーにエレメントを追加または除去したり、エレメントの名前や値を変更したりして出力メッセージを 作成できます。

特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
as01395_