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

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

設計上の考慮事項

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

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

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

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

関連概念
ユーザー定義拡張機能の設計
メッセージ・フロー・ノード
ユーザー定義のメッセージ処理ノード
ユーザー定義のメッセージ処理ノードのライフ・サイクル

関連タスク
C でのメッセージ処理ノードの作成
Java でのメッセージ処理ノードまたは出力ノードの作成

関連資料
C 言語ノード・ユーティリティー関数
パーサー・ユーティリティー関数