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

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

Java でのメッセージ処理ノードまたは出力ノードの作成

メッセージ処理ノードはメッセージを処理するために使用され、出力ノードはメッセージをビット・ストリームとして出力するために使用されます。

始める前に

WebSphere® Message Broker では、SwitchNode および TransformNode という名前の 2 つのサンプル・ユーザー定義ノードのソースが準備されています。 これらのノードは現行の状態で使用することもできますし、変更を加えてもかまいません。

メッセージ処理ノードや出力ノードをコーディングするとき、2 つのタイプは基本的に同じ機能を提供します。 出力ノードでメッセージ処理を実行することもできますし、同様に、メッセージ処理ノードから出力メッセージをビット・ストリームに伝搬させることもできます。 単純化するため、このトピックではメッセージ処理ノードとしてノードを主に参照していますが、どちらのタイプのノードの機能についても取り上げます。

Java ユーザー定義ノードは、.jar ファイルとして配布されます。

新規 Java プロジェクトの作成

WebSphere Message Broker Toolkit に Java ノードを作成する前に、新規 Java プロジェクトを作成する必要があります。
  1. 「ファイル」 > 「新規作成」 > 「プロジェクト」をクリックします。 「Java」を選択し、「次へ」をクリックします。
  2. 「プロジェクト名」フィールドにプロジェクト名を入力して、「次へ」をクリックします。
  3. 「Java 設定」ペインで、「ライブラリー」タブを選択して、「外部 JAR の追加」をクリックします。
  4. install_dir¥classes¥jplugin2.jar を選択します。
  5. 「その他」タブのプロンプトに従って、他のビルド設定を定義します。
  6. 「終了」をクリックします。
このようにしたら、次はこのプロジェクトの中で Java ノードのソースを開発することができます。

メッセージ処理ノード・クラスの宣言

MbNodeInterface をインプリメントし、ブローカーの LIL パスに含められるクラスは、メッセージ処理ノードとしてブローカーに登録されます。 MbNodeInterface をインプリメントする際は、このクラスの evaluate メソッドもインプリメントする必要があります。 evaluate メソッドは、フローを通過するメッセージごとに、ブローカーによって呼び出されます。

クラス名は、末尾が "Node" という語でなければなりません。 例えば、WebSphere Message Broker Toolkit で Basic という名前を割り当てた場合、クラス名を BasicNode にする必要があります。

例えば、メッセージ処理ノード・クラスを宣言するには次のようにします。
package com.ibm.jplugins;

import com.ibm.broker.plugin.*;

public class BasicNode extends MbNode implements MbNodeInterface
WebSphere Message Broker Toolkit でクラスを宣言します。
  1. 「ファイル」 > 「新規」 > 「その他」をクリックし、 「クラス」を選択してから、「次へ」をクリックします。
  2. パッケージおよびクラス名フィールドに適切な値を設定します。
  3. 「スーパークラス」テキスト・フィールドのテキストを削除し、「参照」をクリックします。
  4. MbNode を選択して、「OK」をクリックします。
  5. 「インターフェース」テキスト・フィールドの横にある「追加」ボタンをクリックして、MbNodeInterface を選択します。
  6. 「終了」をクリックします。

ノードのコンストラクターの定義

ノードがインスタンス化されるときは、 ユーザーのノード・クラスのコンストラクターが呼び出されます。 ノードのターミナルを作成し、このコンストラクターの属性のデフォルト値を初期設定します。

メッセージ処理ノードには、 いくつかの入力ターミナルと出力ターミナルが関連付けられています。 メソッド createInputTerminal および createOutputTerminal を、ノードがインスタンス化される時にノードにターミナルを追加するために使用します。

例えば、1 つの入力ターミナルと 2 つの出力ターミナルを持つノードを作成するには、 次のようにします。

public MyNode() throws MbException
{
		// create terminals here
		createInputTerminal ("in");
		createOutputTerminal ("out");
		createOutputTerminal ("failure");
}

メッセージ・データへのアクセス

多くの場合、ユーザー定義ノードは、 その入力ターミナルで受け取ったメッセージの内容にアクセスする必要があります。 メッセージは、構文エレメントのツリーとして表されます。 提供されたユーティリティー関数を使用すると、メッセージ管理、メッセージ・バッファー・アクセス、構文エレメント・ナビゲーション、および構文エレメント・アクセスのためのメソッドを evaluate (評価) することができます。

MbElement クラスには、構文エレメントへのインターフェースがあります。

以下に例を示します。

  1. XML メッセージの中の関係のある構文エレメントにナビゲートするには、次のようにします。
        MbElement rootElement = assembly.getMessage().getRootElement();
        MbElement switchElement = 
    			rootElement.getLastChild().getFirstChild().getFirstChild();
  2. このエレメントの値で示されたターミナルを選択するには、次のようにします。
        String terminalName;
        String elementValue = (String)switchElement.getValue();
        if(elementValue.equals("add"))
          terminalName = "add";
        else if(elementValue.equals("change"))
          terminalName = "change";
        else if(elementValue.equals("delete"))
          terminalName = "delete";
        else if(elementValue.equals("hold"))
          terminalName = "hold";
        else
          terminalName = "failure";
        
        MbOutputTerminal out = getOutputTerminal(terminalName);

メッセージ・オブジェクトの変換

受信した入力メッセージは読み取り専用です。 したがって、メッセージを変換するには、まずそれを新しい出力メッセージに書き込む必要があります。 入力メッセージからエレメントをコピーするか、出力メッセージで新しいエレメントを作成できます。

MbMessage クラスには、コピー・コンストラクターと、 メッセージのルート・エレメントを取得するメソッドがあります。 MbElement クラスには、構文エレメントへのインターフェースがあります。

例えば、組み込みメッセージを含む着信メッセージ・アセンブリーがある場合は、ユーザー定義ノードの evaluate メソッドに次のコードを含めることができます。
  1. メッセージ・アセンブリーとその組み込みメッセージの新しいコピーを作成します。
        MbMessage newMsg = new MbMessage(assembly.getMessage());
        MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
  2. XML メッセージの中の関係のある構文エレメントにナビゲートするには、次のようにします。
        MbElement rootElement = newAssembly.getMessage().getRootElement();
        MbElement switchElement = 
    			rootElement.getFirstElementByPath("/XML/data/action");
  3. 既存のエレメントの値を変更するには、次のようにします。
      String elementValue = (String)switchElement.getValue();
        if(elementValue.equals("add"))
          switchElement.setValue("change");
        else if(elementValue.equals("change"))
          switchElement.setValue("delete");
        else if(elementValue.equals("delete"))
          switchElement.setValue("hold");
        else
          switchElement.setValue("failure");
  4. 切り替えタグの子として新しいタグを追加します。
        MbElement tag = switchElement.createElementAsLastChild(MbElement.TYPE_NAME,
                                                               "PreviousValue",
                                                               elementValue);
  5. この新しいタグに属性を追加します。
        tag.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE,
                                      "NewValue",
                                      switchElement.getValue());
    
        MbOutputTerminal out = getOutputTerminal("out");
変換の一部として、新規メッセージ本体を作成する必要があるかもしれません。 新規メッセージ本体を作成するために、パーサーをメッセージ・ツリー・フォルダーに明確に割り当てる、以下のメソッドのうちの 1 つを使用します。
createElementAfter(String) 
createElementAsFirstChild(String) 
createElementAsLastChild(String) 
createElementBefore(String) 
createElementAsLastChildFromBitstream(byte[], String, String, String, String, int, int, int) 
以下のメソッドは、所有パーサーをフォルダーに関連付けないため、使用しないでください。
createElementAfter(int)
createElementAfter(int, String, Object) 
createElementAsFirstChild(int) 
createElementAsFirstChild(int, String, Object) 
createElementAsLastChild(int) 
createElementAsLastChild(int, String, Object) 
createElementBefore(int) 
createElementBefore(int, String, Object) 

メッセージの伝搬

メッセージを伝搬する前に、何のメッセージ・フロー・データを伝搬するか、またノード・ターミナルに伝搬するか、それともLabelノードに伝搬するかどうかを決定します。

以下に例を示します。
  1. 出力ターミナル "out" にメッセージを伝搬するには、次のようにします。
    MbOutputTerminal out = getOutputTerminal("out");
            out.propagate(newAssembly);
  2. Label ノードにメッセージを伝搬するには、次のようにします。
    MbRoute label1 = getRoute ("label1");
    Label1.propagate(newAssembly);

try/catch の finally ブロックにある clearMessage() 関数を呼び出して、メッセージ・ツリーに割り振られたメモリーを消去します。

同じ MbMessage オブジェクトを複数回伝搬する場合は、MBMessage オブジェクトの finalizeMessage() メソッドを呼び出して、メッセージの変更内容を Java ノードの下流で生成されるビット・ストリームに反映するようにします。以下に例を示します。
MbMessage newMsg = new MbMessage(assembly.getMessage());
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
...
newMsg.finalizeMessage(MbMessage.FINALIZE_NONE);
out.propagate(newAssembly;
...
newMsg.finalizeMessage(MbMessage.FINALIZE_NONE);
out.propagate(newAssembly);

ノード名の宣言

ノード名は、WebSphere Message Broker Toolkit で使用されているものと同じにする必要があります。 すべてのノード名は末尾が "Node" でなければなりません。 名前は以下のメソッドを使用して宣言します。

public static String getNodeName()
{
   return "BasicNode";
}
このメソッドが宣言されていない場合は、Java API フレームワークが以下の規則に従ってデフォルトのノード名を作成します。
  • パッケージ名にはクラス名が付加されます。
  • ドットは除去され、 パッケージ名とクラス名の各部の最初の文字が大文字になります。
例えば、 デフォルトでは以下のクラスにノード名 "ComIbmPluginsamplesBasicNode" が割り当てられます。
package com.ibm.pluginsamples;
public class BasicNode extends MbNode implements MbNodeInterface
{
   ...

属性の宣言

ノード属性は、Java Bean プロパティーと同じ方法で宣言します。 属性の getter および setter メソッドを書き込む必要があります。 API フレームワークは、Java Bean イントロスペクション規則を使用して属性名を推測します。 例えば、以下の 2 つのメソッドを宣言するには、次のようにします。

private String attributeVariable;

public String getFirstAttribute()
{
  return attributeVariable;
}

public void setFirstAttribute(String value)
{
  attributeVariable = value;
}

ブローカーは、このノードが firstAttribute という属性を持つことを推測します。 この名前は、内部クラス・メンバー変数名ではなく、get または set メソッドの名前に由来します。 属性はストリングとしてしか公開できないので、 get または set メソッドで、数値タイプとストリングの変換を行う必要があります。 例えば、次のメソッドは timeInSeconds という属性を定義します。

int seconds;

public String getTimeInSeconds()
{
  return Integer.toString(seconds);
}

public void setTimeInSeconds(String value)
{
  seconds = Integer.parseInt(value);
}

ノード機能のインプリメント

evaluate メソッドは MbNodeInterface で定義され、メッセージを処理するためにブローカーによって呼び出されます。 このメソッドには、ノード用のすべての処理関数が含まれます。

evaluate メソッドには、ブローカーによって渡される以下の 2 つのパラメーターがあります。
  1. MbMessageAssembly。 これには、適切なメソッドを使用してアクセスできる以下のオブジェクトが含まれています。
    • 着信メッセージ
    • LocalEnvironment
    • グローバルな Environment
    • ExceptionList
  2. メッセージが着信した入力ターミナル。
例えば、次のコードの抜粋は、evaluate メソッドをどのように書き表せばよいかを示しています。
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException
  {
    // add message processing code here

    getOutputTerminal("out").propagate(assembly);
  }

メッセージ・フロー・データ (メッセージ、Environment、LocalEnvironment、および ExceptionList から成る) が、ノードの入力ターミナルで受信されます。

ノードのインスタンスの削除

ノードのインスタンスは、次のいずれかの場合に削除します。
  • ブローカーがシャットダウンされた。
  • ノードまたはノードを含むメッセージ・フローを除去し、 構成を再デプロイした。
ノードが、例えばソケットの終了などの、クリーンアップ・オペレーションを実行するようにしたい場合は、onDelete メソッドのインプリメンテーションを組み込みます。
public void onDelete()
{
  // perform node cleanup if necessary
}

このメソッドはノードを削除する直前に、ブローカーによって呼び出されます。

特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック

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

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


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