Java でのメッセージ処理ノードまたは出力ノードの作成
メッセージ処理ノードはメッセージを処理するために使用され、出力ノードはメッセージをビット・ストリームとして出力するために使用されます。
始める前に
このタスクの概要
IBM® App Connect Enterprise SwitchNode および TransformNode という 2 つのサンプルユーザー定義ノードのソースコードを提供します。 これらのノードは現行の状態で使用することもできますし、変更を加えてもかまいません。
メッセージ処理ノードや出力ノードをコーディングするとき、2 つのタイプは基本的に同じ機能を提供します。 出力ノードでメッセージ処理を実行することもできますし、同様に、メッセージ処理ノードから出力メッセージをビット・ストリームに伝搬させることもできます。 単純化するため、このトピックではメッセージ処理ノードとしてノードを主に参照していますが、どちらのタイプのノードの機能についても当てはまります。
Java ユーザー定義ノードは、 .jar ファイルとして配布されます。
新規 Java プロジェクトの作成
このタスクの概要
- をクリックします。 「Java」 を選択し、 「次へ」をクリックします。
- 「プロジェクト名」 フィールドにプロジェクトの名前を入力し、 「次へ」をクリックします。
- 「Java 設定」ペインで、「ライブラリー」タブを選択して、「外部 JAR の追加」をクリックします。
- install_dir\server\classes\jplugin2.jarを選択します。
- 「その他」タブのプロンプトに従って、他のビルド設定を定義します。
- 「完了 (Finish)」 をクリックします。
メッセージ処理ノード・クラスの宣言
このタスクの概要
MbNodeInterface をインプリメントし、統合ノードの LIL パスに含められるクラスは、メッセージ処理ノードとして統合ノードに登録されます。 MbNodeInterface をインプリメントする際は、このクラスの evaluate メソッドもインプリメントする必要があります。 evaluate メソッドは、フローを通過するメッセージごとに、統合ノードによって呼び出されます。
クラス名は、末尾が "Node" という語でなければなりません。 たとえば、 IBM App Connect Enterprise ツールキットで名前を「Basic」として割り当てた場合、クラス名は「 BasicNode 」でなければなりません。
package com.ibm.jplugins;
import com.ibm.broker.plugin.*;
public class BasicNode extends MbNode implements MbNodeInterface
- をクリックし、 「クラス」を選択してから、 「次へ」をクリックします。
- パッケージおよびクラス名フィールドに適切な値を設定します。
- 「スーパークラス」テキスト・フィールドのテキストを削除し、「参照」をクリックします。
- MbNode を選択し、 「OK」をクリックします。
- クリック追加インターフェーステキストフィールドの横にあるボタンをクリックし、 MbNodeInterface。
- 「完了 (Finish)」 をクリックします。
ノードのコンストラクターの定義
このタスクの概要
ノードがインスタンス化されるときは、 ユーザーのノード・クラスのコンストラクターが呼び出されます。 ノードのターミナルを作成し、このコンストラクターの属性のデフォルト値を初期設定します。
メッセージ処理ノードには、いくつかの入力ターミナルと出力ターミナルが関連付けられています。 メソッド 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); - XML メッセージの中の関係のある構文エレメントにナビゲートするには、次のようにします。
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) メッセージの伝搬
このタスクの概要
メッセージを伝搬する前に、伝搬するメッセージ・フロー・データを決定し、ノード・ターミナルに伝搬するか、 ラベル ・ノードに伝搬するかを決定します。
- 出力ターミナル "out" にメッセージを伝搬するには、次のようにします。
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly); - Label ノードにメッセージを伝搬するには、次のようにします。
MbRoute label1 = getRoute ("label1"); Label1.propagate(newAssembly);
try/catch の finally ブロックにある clearMessage() 関数を呼び出して、メッセージ・ツリーに割り振られたメモリーを消去します。
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);ノード名の宣言
このタスクの概要
ノード名は、 IBM App Connect Enterprise ツールキットで使用されているものと同じである必要があります。 すべてのノード名は末尾が "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;
}
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 で定義され、メッセージを処理するために統合ノードによって呼び出されます。 このメソッドには、ノード用のすべての処理関数が含まれます。
- MbMessageAssembly。
これには、適切なメソッドを使用してアクセスできる以下のオブジェクトが含まれています。
- 着信メッセージ
- LocalEnvironment
- グローバルな Environment
- ExceptionList
- メッセージが着信した入力ターミナル。
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException
{
// add message processing code here
getOutputTerminal("out").propagate(assembly);
}メッセージ・フロー・データ (メッセージ、Environment、LocalEnvironment、および ExceptionList から成る) が、ノードの入力ターミナルで受信されます。
ノードのインスタンスの削除
このタスクの概要
- 統合ノードがシャットダウンされた。
- ノードまたはノードを含むメッセージ・フローを除去し、 構成を再デプロイした。
public void onDelete()
{
// perform node cleanup if necessary
}このメソッドはノードを削除する直前に、統合ノードによって呼び出されます。