メッセージ処理ノードはメッセージを処理するために使用され、出力ノードはメッセージをビット・ストリームとして出力するために使用されます。
WebSphere® Message Broker では、SwitchNode および TransformNode という名前の 2 つのサンプル・ユーザー定義ノードのソースが準備されています。これらのノードは現行の状態で使用することもできますし、変更を加えてもかまいません。
メッセージ処理ノードや出力ノードをコーディングするとき、2 つのタイプは基本的に同じ機能を提供します。 出力ノードでメッセージ処理を実行することもできますし、同様に、メッセージ処理ノードから出力メッセージをビット・ストリームに伝搬させることもできます。 単純化するため、このトピックではメッセージ処理ノードとしてノードを主に参照していますが、どちらのタイプのノードの機能についても取り上げます。
Java ユーザー定義ノードは、.jar ファイルとして配布されます。
「Java 設定」パネルが表示されます。
MbNodeInterface をインプリメントし、ブローカーの LIL パスに含められるクラスは、メッセージ処理ノードとしてブローカーに登録されます。 MbNodeInterface をインプリメントする際は、このクラスの evaluate メソッドもインプリメントする必要があります。evaluate メソッドは、フローを通過するメッセージごとに、ブローカーによって呼び出されます。
package com.ibm.jplugins; import com.ibm.broker.plugin.*; public class BasicNode extends MbNode implements MbNodeInterface
ノードがインスタンス化されるときは、 ユーザーのノード・クラスのコンストラクターが呼び出されます。 ノードのターミナルを作成し、このコンストラクターの属性のデフォルト値を初期設定します。
メッセージ処理ノードには、 いくつかの入力ターミナルと出力ターミナルが関連付けられています。メソッド createInputTerminal および createOutputTerminal を、ノードがインスタンス化される時にノードにターミナルを追加するために使用します。
例えば、1 つの入力ターミナルと 2 つの出力ターミナルを持つノードを作成するには、 次のようにします。
public MyNode() throws MbException { // create terminals here createInputTerminal ("in"); createOutputTerminal ("out"); createOutputTerminal ("failure"); }
多くの場合、ユーザー定義ノードは、 その入力ターミナルで受け取ったメッセージの内容にアクセスする必要があります。 メッセージは、構文エレメントのツリーとして表されます。 提供されたユーティリティー関数を使用すると、メッセージ管理、メッセージ・バッファー・アクセス、構文エレメント・ナビゲーション、および構文エレメント・アクセスのためのメソッドを evaluate (評価) することができます。
MbElement クラスには、構文エレメントへのインターフェースがあります。
以下に例を示します。
受信した入力メッセージは読み取り専用です。 したがって、メッセージを変換するには、まずそれを新しい出力メッセージに書き込む必要があります。 入力メッセージからエレメントをコピーするか、出力メッセージで新しいエレメントを作成できます。
MbMessage クラスには、コピー・コンストラクターと、 メッセージのルート・エレメントを取得するメソッドがあります。 MbElement クラスには、構文エレメントへのインターフェースがあります。
MbMessage newMsg = new MbMessage(assembly.getMessage()); MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
MbElement rootElement = newAssembly.getMessage().getRootElement(); MbElement switchElement = rootElement.getFirstElementByPath("/XML/data/action");
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");
MbElement tag = switchElement.createElementAsLastChild(MbElement.TYPE_NAME, "PreviousValue", elementValue);
tag.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "NewValue", switchElement.getValue()); MbOutputTerminal out = getOutputTerminal("out");
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ノードに伝搬するかどうかを決定します。
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
MbRoute label1 = getRoute ("label1"); Label1.propagate(newAssembly);
try/catch の finally ブロックにある clearMessage() 関数を呼び出して、メッセージ・ツリーに割り振られたメモリーを消去します。
ノード名は、ワークベンチ で使用されているものと同じにする必要があります。 すべてのノード名は末尾が "Node" でなければなりません。 名前は以下のメソッドを使用して宣言します。
public static String getNodeName() { return "BasicNode"; }
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; } publc 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 で定義され、メッセージを処理するためにブローカーによって呼び出されます。 このメソッドには、ノード用のすべての処理関数が含まれます。
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { // add message processing code here getOutputTerminal("out").propagate(assembly); }
メッセージ・フロー・データ (メッセージ、Environment、LocalEnvironment、および ExceptionList から成る) が、ノードの入力ターミナルで受信されます。