WebSphere Message Broker バージョン 8.0.0.5 オペレーティング・システム: AIX、HP-Itanium、Linux、Solaris、Windows、z/OS

製品の最新バージョンについては、IBM Integration Bus バージョン 9.0 をご覧ください。

Java メッセージ処理または出力ノードの機能の拡張

メッセージ処理ノードまたは出力ノード内で、Java™ ノードに拡張機能を追加することができます。

始める前に

Java でのメッセージ処理ノードまたは出力ノードの作成をお読みください。

ESQL へのアクセス

ノードは、Compute ノードの ESQL 構文を使用して ESQL 式を呼び出すことができます。 ユーザーは、ESQL 式を使用してメッセージのコンポーネントを作成および変更し、 入力メッセージと外部データベースのデータの両方を参照できます。

以下の手順は、ユーザー定義ノードの evaluate メソッドから ESQL を使用してトランザクションを制御する方法を示しています。
  1. 使用する ODBC データ・ソースの名前を設定します。 以下に例を示します。
    String dataSourceName = "myDataSource";
  2. 実行する ESQL ステートメントを設定します。
    String statement = 
       "SET OutputRoot.XMLNS.data = 
              (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
    あるいは、結果を戻さないステートメントを実行する場合は、次のようにします。
    String statement = "PASSTHRU(
                            'INSERT INTO Database.Table1 VALUES(
                                 InputRoot.XMLNS.DataField1,
                                 InputRoot.XMLNS.DataField2)');";
  3. 以下の中から、トランザクションのタイプを選択します。
    MbSQLStatement.SQL_TRANSACTION_COMMIT
    ESQL ステートメントが完了した直後にトランザクションをコミットします。
    MbSQLStatement.SQL_TRANSACTION_AUTO
    メッセージ・フローの完了時にトランザクションをコミットします。 (必要に応じてロールバックが実行されます。)
    以下に例を示します。
    int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
  4. ESQL ステートメントを取得します。 以下に例を示します。
    MbSQLStatement sql = 
           createSQLStatement(dataSourceName, statement, transactionType);
    トランザクション・タイプをデフォルトの MbSQLStatement.SQL_TRANSACTION_AUTO) にする場合は、メソッド createSQLStatement(data source, statement を使用することができます。
  5. 伝搬する新しいメッセージ・アセンブリーを作成します。
    MbMessageAssembly newAssembly = 
           new MbMessageAssembly(assembly, assembly.getMessage());
  6. ESQL ステートメントを実行します。
    sql.select(assembly, newAssembly);
    あるいは、結果を戻さない ESQL ステートメントを実行する場合は、次のようにします。
    sql.execute(assembly);

データベースと相互作用する

メッセージ処理ノードの Java コードから、データベースとの相互作用が可能です。 提供されるサポートは、JavaCompute ノード用に作成する Java コードに対するサポートと同じです。使用可能なオプションと、適用される利点および制約事項について詳しくは、JavaCompute ノードを使用したデータベースとの対話を参照してください。

例外の処理

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);
          }
      }
  }

すべての現行の例外にアクセスできるような仕方で、ユーザー定義メッセージ処理ノードまたは出力ノードを開発できます。 例えば、 データベース例外をキャッチするには 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.XMLNS.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 メソッドでビット・ストリームに変換し直す必要があります。 このタスクは、MbMessagegetBuffer メソッドを使用して実行します。

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

 }

通常、出力ノードの場合はメッセージは出力ターミナルに伝搬されないので、ここで戻すことができます。

WebSphere® MQ キューに書き込むときは、提供されている MQOutput ノードを使用しなければなりません。 これは、ブローカーが、スレッド単位で、内部的に WebSphere MQ 接続およびオープン・キュー・ハンドルを保守しているからです。 これらのハンドルは、パフォーマンスを最適化するために、キャッシュされます。 さらに、ブローカーは特定の WebSphere MQ イベントの発生時に例外シナリオを処理しますが、WebSphere MQ MQI 呼び出しが ユーザー定義出力ノードで使用されている場合、このリカバリーは不利な影響を受けます。

特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        最終更新:
        
        最終更新: 2015-02-28 17:48:11


タスク・トピックタスク・トピック | バージョン 8.0.0.5 | as24990_