始める前に
「Java 設定」パネルが表示されます。
MbInputNodeInterface をインプリメントし、ブローカーの LIL パスに含められるクラスは、 入力ノードとしてブローカーに登録されます。 MbInputNodeInterface をインプリメントする場合は、このクラスの run メソッドもインプリメントしなければなりません。run メソッドは、 メッセージ・フローの開始を表し、 メッセージを公式化するデータを含んでいて、これをフローに伝搬します。 ブローカーは、スレッドが使用可能になると、 指定されたスレッド化モデルに従って run メソッドを呼び出します。
入力ノード・クラスを宣言するには、例えば次のようにします。
package com.ibm.jplugins; import com.ibm.broker.plugin.*; public class BasicInputNode extends MbInputNode implements MbInputNodeInterface { ...
ノードがインスタンス化されるときは、 ユーザーのノード・クラスのコンストラクターが呼び出されます。 これは、ノードのターミナルを作成し、属性のデフォルト値を初期設定する場所です。
入力ノードには、いくつかの出力ターミナルが関連付けられますが、 通常は入力ターミナルはありません。 ノードに出力ターミナルを追加するには、 ノードをインスタンス化するときに createOutputTerminal メソッドを使用します。 例えば、3 つの出力ターミナルを持つノードを作成するには、 次のようにします。
public BasicInputNode() throws MbException { createOutputTerminal ("out"); createOutputTerminal ("failure"); createOutputTerminal ("catch"); setAttribute ("firstParserClassName","myParser"); attributeVariable = "none"; }
入力ノードは、ノードからの出力が正しい形式になっている限り、 どんなタイプの外部ソース (ファイル・システム、キュー、またはデータベースなど) からでも、 他の Java プログラムと同じようにデータを受信することができます。
ユーザーは入力データを格納する入力バッファー (またはビット・ストリーム) を準備し、これをメッセージ・オブジェクトと関連付けます。 MbInputNode クラスの createMessage メソッドを使用してバイト・アレイからメッセージを作成し、 このメッセージから有効なメッセージ・アセンブリーを生成します。 これらのメソッドについての詳細は、Java API を参照してください。例えば、ファイルから入力データを読み取るには、次のようにします。
メッセージ・アセンブリーを作成したら、それをノードのターミナルの 1 つに伝搬することができます。
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
msg.clearMessage();
メッセージ・ツリー用に割り振られているメモリーをクリアするには、最後の try/catch ブロック内で clearMessage() 関数を呼び出します。
ブローカー・インフラストラクチャーは、 メッセージ処理の完了時の WebSphere MQ やデータベースの作業単位のコミットの制御などのトランザクション問題を処理します。 ただし、ユーザー定義ノード内から変更されたリソースは、ブローカーのトランザクション制御に置かれるとは限りません。
各メッセージ・フロー・スレッドは、 各メッセージ・フローごとに維持されているスレッドのプールから割り振られ、 run メソッドで実行を開始します。
ユーザー定義ノードが戻り値を使用して、トランザクションが正常かどうかを示し、 トランザクションをコミットするかロールバックするか、 また、いつスレッドをプールに戻すかを制御します。 ブローカーのインフラストラクチャーが処理されない例外を検出した場合、 トランザクションはロールバックされます。
トランザクションとスレッド化の動作は、以下の適切な戻り値を使用して判断します。
public int run( MbMessageAssembly assembly ) throws MbException { byte[] data = getDataWithTimeout(); // user supplied method // returns null if timeout if( data == null ) return TIMEOUT; MbMessage msg = createMessage( data ); msg.finalizeMessage( MbMessage.FINALIZE_VALIDATE ); MbMessageAssembly newAssembly = new MbMessageAssembly( assembly, msg ); dispatchThread(); getOutputTerminal( "out" ).propagate( newAssembly ); return SUCCESS_RETURN; }
ノードの名前を宣言して、ノードがワークベンチに識別されるようにする必要があります。 すべてのノード名は末尾が "Node" でなければなりません。 名前は以下のメソッドを使用して宣言します。
public static String getNodeName() { return "BasicInputNode"; }
package com.ibm.pluginsamples; public class BasicInputNode extends MbInputNode implements MbInputNodeInterface { ...
ノード属性は、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); }
先に述べたとおり、ブローカーは run メソッドを呼び出して入力メッセージを作成します。 このメソッドは、入力ノードのためのすべてのアプリケーション処理機能を備えている必要があります。
入力ノードは通常、 最初に入力メッセージを構文解析するメッセージ・パーサーを判別します。 例えば、プリミティブ MQInput ノードは、 MQMD ヘッダーを構文解析するために MQMD パーサーが必要であることを指示します。 ユーザー定義入力ノードは、 デフォルトとして組み込まれる、オーバーライドも可能な以下の属性を使用することによって、 適切なヘッダーかメッセージ・パーサー、および構文解析の制御のモードを選択することができます。
onDelete メソッドは次のようにしてインプリメントします。
public void onDelete() { // perform node cleanup if necessary }