入力ノードは、通常は組み込み入力ノードによってサポートされていない送信元からのメッセージを、メッセージ・フローに受信するために使用されます。
Java ユーザー定義ノードは、.jar ファイルとして配布されます。
WebSphere® Message Broker Toolkit に Java ノードを作成する前に、 Java プロジェクトを作成する必要があります。
MbInputNodeInterface をインプリメントし、ブローカーの LIL パスに含められるすべてのクラスは、 入力ノードとしてブローカーに登録されます。 MbInputNodeInterface をインプリメントする場合は、このクラスの run メソッドもインプリメントしなければなりません。 run メソッドは、 メッセージ・フローの開始を表し、 メッセージを公式化するデータを含んでいて、これをフローに伝搬します。 ブローカーは、スレッドが使用可能になると、 指定されたスレッド化モデルに従って run メソッドを呼び出します。
クラス名は、末尾が "Node" という語でなければなりません。 例えば、WebSphere Message Broker Toolkit で名前が BasicInput である場合、クラス名は BasicInputNode でなければなりません。
入力ノード・クラスを宣言するには、例えば次のようにします。
package com.ibm.jplugins;
import com.ibm.broker.plugin.*;
public class BasicInputNode extends MbInputNode implements MbInputNodeInterface
{
...
以下のステップに従って、WebSphere Message Broker Toolkit でのこのアクションを完了します。
ノードがインスタンス化されるときは、 ノード・クラスのコンストラクターが呼び出されます。 このクラスは、ノードのターミナルを作成し、属性のデフォルト値を初期設定する場所です。
入力ノードには、いくつかの出力ターミナルが関連付けられますが、 通常は入力ターミナルはありません。 ノードに出力ターミナルを追加するには、 ノードをインスタンス化するときに createOutputTerminal メソッドを使用します。 例えば、3 つの出力ターミナルを持つノードを作成するには、 次のようにします。
public BasicInputNode() throws MbException
{
createOutputTerminal ("out");
createOutputTerminal ("failure");
createOutputTerminal ("catch");
setAttribute ("firstParserClassName","myParser");
attributeVariable = "none";
}
入力ノードは、ノードからの出力が正しい形式になっていれば、どんなタイプの外部ソース (ファイル・システム、キュー、またはデータベースなど) からでも、他のすべての Java プログラムと同じようにデータを受信することができます。
入力データを格納する入力バッファー (またはビット・ストリーム) を準備し、これをメッセージ・オブジェクトと関連付けます。 MbInputNode クラスの createMessage メソッドを使用してバイト・アレイからメッセージを作成し、このメッセージから有効なメッセージ・アセンブリーを生成します。 例えば、ファイルから入力データを読み取るには、次のようにします。
メッセージ・アセンブリーの作成後、それをノードで定義された出力ターミナルの 1 つに伝搬できます。
MbOutputTerminal out = getOutputTerminal("out");
out.propagate(newAssembly);
msg.clearMessage();
メッセージ・ツリー用に割り振られているメモリーをクリアするには、 try/catch の finally ブロック内で 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;
}
WebSphere Message Broker Toolkit によって使用および識別されるノード名を宣言する必要があります。 すべてのノード名は、末尾が "Node" でなければなりません。 名前は以下のメソッドを使用して宣言します。
public static String getNodeName()
{
return "BasicInputNode";
}
package com.ibm.pluginsamples;
public class BasicInputNode extends MbInputNode implements MbInputNodeInterface
{
...
Java bean プロパティーに使用したのと同じメソッドを使用してノード属性を宣言します。 属性の get メソッドおよび set メソッドはユーザーが作成しなければなりません。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);
}
先に述べたとおり、ブローカーは run メソッドを呼び出して入力メッセージを作成します。 このメソッドは、入力ノードのためのすべてのアプリケーション処理機能を備えている必要があります。
入力ノード・インプリメンテーションは通常、入力メッセージをどのメッセージ・パーサーが最初に構文解析するかを判別します。 例えば、組み込まれている MQInput ノードは、MQMD ヘッダーを構文解析するために MQMD パーサーが必要であることを指示します。 ユーザー定義入力ノードは、組み込まれている以下のデフォルト属性 (オーバーライド可能) を使用することによって、適切なヘッダーかメッセージ・パーサー、および構文解析の制御のモードを選択することができます。
onDelete メソッドを、次のようにしてインプリメントします。
public void onDelete()
{
// perform node cleanup if necessary
}