始める前に
WebSphere Business Integration Message Broker では、SwitchNode および TransformNode という名前の 2 つのサンプル・ユーザー定義ノードのソースが準備されています。 これらのノードは現行の状態で使用することもできますし、変更を加えてもかまいません。
概念上、メッセージ処理ノードは何らかの形でメッセージを処理するために使用され、 出力ノードはメッセージをビット・ストリームとして出力するために使用されます。 しかし、メッセージ処理ノードや出力ノードをコーディングするとき、 これらは基本的に同じものです。 出力ノードでメッセージ処理を実行することもできますし、 同様に、メッセージ処理ノードを使用してメッセージをビット・ストリームとして出力することもできます。 単純化するため、 このトピックではメッセージ処理ノードとしてノードを主に参照していますが、 どちらのタイプのノードの機能についても取り上げます。
分散プラットフォーム上でブローカーをデプロイする予定の z/OS で、 Java ノードを開発しないでください。 これは、z/OS 上の Java のレベルが、分散プラットフォーム上で Java のレベルと互換性のある コードを作成しない可能性があるためです。
多くの場合、ユーザー定義ノードは、 その入力ターミナルで受け取ったメッセージの内容にアクセスする必要があります。 メッセージは、構文エレメントのツリーとして表されます。 ユーティリティー関数のグループが、メッセージ管理、メッセージ・バッファー・アクセス、 構文エレメント・ナビゲーション、および構文エレメント・アクセス用に提供されます。
MbElement クラスには、構文エレメントへのインターフェースがあります。 Java API の詳細については、Javadoc を参照してください。
たとえば、以下のようになります。
MbElement rootElement = assembly.getMessage().getRootElement(); MbElement switchElement = rootElement.getLastChild().getFirstChild().getFirstChild();
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 クラスには、構文エレメントへのインターフェースがあります。
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");
ノードは、Compute ノードの ESQL 構文を使用して ESQL 式を呼び出すことができます。 ユーザーは、ESQL 式を使用してメッセージのコンポーネントを作成および変更し、 入力メッセージと外部データベースのデータの両方を参照できます。
String dataSourceName = "myDataSource";
String statement = "SET OutputRoot.XML.data = (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
String statement = "PASSTHRU( 'INSERT INTO Database.Table1 VALUES( InputRoot.XML.DataField1, InputRoot.XML.DataField2)');";
int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
MbSQLStatement sql = createSQLStatement(dataSourceName, statement, transactionType);トランザクション・タイプをデフォルトの MbSQLStatement.SQL_TRANSACTION_AUTO) にする場合は、 メソッド createSQLStatement(dataSource, statement) を使用することができます。
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, assembly.getMessage());
sql.select(assembly, newAssembly);
sql.execute(assembly);
ESQL の詳細については、ESQLを参照してください。
mbException クラスを使用して、 例外をキャッチして例外に接続します。 mbException クラスは、 ブローカー例外リスト内の例外の子を表す例外オブジェクトの配列を戻します。 戻される各エレメントは、その例外タイプを指定します。 例外に子が存在しない場合には、空の配列が戻されます。 次のコード・サンプルは、MbException クラスの使用法の例を示しています。
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { try { // plug-in functionality } catch(MbException ex) { traverse(ex, 0); throw ex; // if re-throwing, it must be the original exception that was caught } } void traverse(MbException ex, int level) { if(ex != null) { // Do whatever action here System.out.println("Level: " + level); System.out.println(ex.toString()); System.out.println("traceText: " + ex.getTraceText()); // traverse the hierarchy MbException e[] = ex.getNestedExceptions(); int size = e.length; for(int i = 0; i < size; i++) { traverse(e[i], level + 1); } } }
mbException クラスの使用法の詳細については、javadoc を参照してください。
こうした方法で、すべての現行の例外にアクセスできるユーザー定義メッセージ処理ノードまたは出力ノードを開発できます。 たとえば、 データベース例外をキャッチするには MbSQLStatement クラスを使用できます。 このクラスは「throwExceptionOnDatabaseError」属性の値を設定します。 この属性はデータベース・エラーの発生時のブローカー動作を決定します。 true に設定すると、 例外が送出される場合、ユーザー定義拡張機能がキャッチして処理できます。
次のコード・サンプルは、 MbSQLStatement クラスの使用法の例を示しています。
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { MbMessage newMsg = new MbMessage(assembly.getMessage()); MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg); String table = assembly.getMessage().getRootElement().getLastChild().getFirstChild().getName(); MbSQLStatement state = createSQLStatement( "dbName", "SET OutputRoot.XML.integer[] = PASSTHRU('SELECT * FROM " + table + "');" ); state.setThrowExceptionOnDatabaseError(false); state.setTreatWarningsAsErrors(true); state.select( assembly, newAssembly ); int sqlCode = state.getSQLCode(); if(sqlCode != 0) { // Do error handling here System.out.println("sqlCode = " + sqlCode); System.out.println("sqlNativeError = " + state.getSQLNativeError()); System.out.println("sqlState = " + state.getSQLState()); System.out.println("sqlErrorText = " + state.getSQLErrorText()); } getOutputTerminal("out").propagate(assembly); }
メッセージを伝搬する前に、何のメッセージ・フロー・データを伝搬するか、 また、どのノードのターミナルでデータを受信するかを決定する必要があります。 メッセージは伝搬する前にファイナライズする必要があります。 メッセージを伝搬したら、 出力メッセージを削除しなければなりません。
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
newMsg.clearMessage();
出力装置に書き込みをするには、 論理 (階層) メッセージをビット・ストリームに変換し直す必要があります。 これは、以下のように、MbMessage の getBuffer メソッドを使用して実行します。
public void evaluate( MbMessageAssembly assembly, MbInputTerminal in) throws MbException { MbMessage msg = assembly.getMessage(); byte[] bitstream = msg.getBuffer(); // write the bitstream out somewhere writeBitstream( bitstream ); // user method }
通常、出力ノードの場合はメッセージは出力ターミナルに伝搬されないので、 ここで戻すことができます。
「Java 設定 (Java Settings)」パネルが表示されます。
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"); }
ノードの名前を宣言して、ノードがワークベンチに識別されるようにする必要があります。 すべてのノード名は末尾が "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); }
先に述べたとおり、 メッセージ処理ノードまたは出力ノードの場合、 MbNodeInterface で定義されている、 evaluate メソッドをインプリメントする必要があります。 これは、メッセージを処理するためにブローカーによって呼び出されます。 このメソッドは、ノード用のすべての処理関数を提供します。
メッセージ・フロー・データ (メッセージ、グローバル環境、ローカル環境、および例外リスト) が、 ノードの入力ターミナルで受信されます。
onDelete メソッドは次のようにしてインプリメントします。
public void onDelete() { // perform node cleanup if necessary }
注意 |
商標 |
ダウンロード |
ライブラリー |
技術サポート |
フィードバック
![]() ![]() |
as09970_ |