始める前に
ノードは、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 クラスは、ブローカー例外リスト内の例外の子を表す例外オブジェクトの配列を戻します。 戻される各エレメントは、その例外タイプを指定します。 例外に子が存在しない場合には、空の配列が戻されます。 次のコード・サンプルは、ユーザー定義ノードの evaluate メソッドで 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 に設定すると、例外がスローされた場合、ユーザー定義拡張機能の evaluate メソッドがそれをキャッチして処理できます。
次のコード・サンプルは、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( newAssembly ); }
出力装置に書き込みをするには、論理 (階層) メッセージを evaluate メソッドでビット・ストリームに変換し直す必要があります。 これは、以下のように、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 }
通常、出力ノードの場合はメッセージは出力ターミナルに伝搬されないので、 ここで戻すことができます。