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

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

CMP アプリケーション内のオブジェクト通知を使用した、ブローカー管理の結果の検査

オブジェクトの通知を使用して、ご使用のアプリケーションがオブジェクトに対して行った要求の結果を判別します。

CMP は、コマンドが完了したとき、または管理対象オブジェクトが変更されたときには、そのたびにアプリケーションに通知することができます。 OBSERVER 設計パターンを使用することにより、ご使用の CMP アプリケーションは、オブジェクトが変更または削除される場合や、以前に実行依頼されたアクションに対する応答がブローカーから戻されるときには、特定のメソッドが呼び出されているユーザー提供オブジェクトに対するハンドルを定義することができます。

ユーザー提供コードは AdministeredObjectListener インターフェースをインプリメントしなければなりません。 このインターフェースは、リスナーが登録されている管理対象オブジェクトでイベントが発生するときに、CMP によって呼び出されるメソッドを定義します。 以下のメソッドが定義済みです。

processModify(…)
processModify(…) は、リスナーが登録されている管理対象オブジェクトが、ブローカーによって変更された 1 つ以上の属性を持つ場合に呼び出されます。 processModify() メソッド引数を使用することによってこの通知で提供される情報は、以下のとおりです。
  1. 通知が参照する AdministeredObject へのハンドル。
  2. 変更されたキー名を含むストリングのリスト。
  3. オブジェクトについて作成された新規のサブコンポーネント (例えば、ブローカー内の新規実行グループ) を記述するストリングのリスト。
  4. オブジェクトから除去されたサブコンポーネントを記述するストリングのリスト。

最後の 2 つのパラメーターに渡されるストリングのフォーマットは、管理対象オブジェクトの内部表記です。 getManagedSubcomponentFromStringRepresentation() メソッドを使用して、この表記を管理対象オブジェクト・タイプに変えることができます。

次の追加情報をご覧ください。

  1. パフォーマンスを拡張するために、ストリングはこれらのリスト内に渡されます。CMP はリソースがインスタンス化する管理対象オブジェクトが呼び出し側アプリケーションによって具体的に要求されなければ、それらを使用しません。
  2. アプリケーションがバッチ・メソッドを使用している場合、または CMP にブローカーとの通信問題がある場合には、processModify() メソッドがリスナーについて最初に呼び出されるときに、changed attributes パラメーターにオブジェクトの属性名の完全なセットを含めることができます。
processDelete(…)

リスナーが登録されているオブジェクトがブローカーから完全に除去される場合に、processDelete(…) が呼び出されます。 processDelete(…) には 1 つのパラメーター、すなわち削除された管理対象オブジェクトへのハンドルが提供されます。このメソッドが戻されると、管理対象オブジェクト・ハンドルは有効ではなくなります。 processDelete(…) イベントの発生と同時期に、削除されたオブジェクトの親のリスナーに processModify(…) イベントが送信され、サブコンポーネントの親のリストで変更が通知されます。

processActionResponse(…)
processActionResponse(…) アプリケーションによって実行依頼された以前のアクションが完了したことをアプリケーションに通知するイベントです。 1 つだけの processActionResponse(…) イベントは、CMP アプリケーションによって発行された状態変更操作ごとに受信されます。 このイベントには、以下の情報項目が含まれています。
  1. 要求が実行依頼された管理対象オブジェクトへのハンドル。
  2. 要求の完了コード。
  3. 結果に関連したゼロまたはそれ以上の通知 (BIP) メッセージのセット。
  4. 実行依頼された要求を詳しく記述する (key, value) の対のセット。 これらの対を構文解析する方法についての情報が資料にあるか検査します。

レジスターを登録するために、各管理対象オブジェクトに registerListener() メソッドがあります。これは、そのオブジェクトに対するイベントが発生するたびに、提供されたコードを呼び出すように CMP に指示するために使用されます。 複数の管理対象オブジェクトからの通知の場合は、同じ AdministeredObjectListener を登録することができます。 また、同じ管理対象オブジェクトに対して複数の AdministeredObjectListeners を登録することもできます。

以下の例ではこの技法を示すため、ブローカー・オブジェクトでリスナーを登録し、それが変更されるたびにメッセージを表示します。
import com.ibm.broker.config.proxy.*;
import com.ibm.broker.config.proxy.CompletionCodeType;
import java.util.List;
import java.util.ListIterator;
import java.util.Properties;

public class MonitorBroker implements AdministeredObjectListener {

  public static void main(String[] args) {
        
    BrokerProxy b = null;
    try {
      BrokerConnectionParameters bcp =
         new MQBrokerConnectionParameters(
           "localhost",
           1414,
           "");
      b = BrokerProxy.getInstance(bcp);   
    } catch (ConfigManagerProxyException cmpex) {
      System.out.println("Error connecting: "+cmpex);
    }
        
    if (b != null) {
      System.out.println("Connected to broker");
      listenForChanges(b);
      b.disconnect();
    }
  }

  private static void listenForChanges(AdministeredObject obj)
  {
    if (obj != null) {
      obj.registerListener(new MonitorBroker());
      while(true) {
        // thread could do something else here instead
        try {
          Thread.sleep(10000);
        } catch (InterruptedException ex) {
          // ignore
        }
      }
    }
  }
  
  public void processActionResponse(AdministeredObject obj,
                                    CompletionCodeType cc,
                                    List bipMessages,
                                    Properties refProperties) {
    // Event ignored in this example
  }
  
  public void processDelete(AdministeredObject deletedObject) {
         // Event ignored in this example
  }
  
  public void processModify(AdministeredObject affectedObject,
                            List changedAttributes,
                            List newChildren,
                            List removedChildren) {
    try {
      System.out.println(affectedObject+" has changed:");
      ListIterator e = changedAttributes.listIterator();
      while (e.hasNext()) {
        String changedAttribute = (String) e.next();
        System.out.println("Changed: "+changedAttribute);
      }
      ListIterator e2 = newChildren.listIterator();
      while (e2.hasNext()) {
        String newChildStr = (String) e2.next();
        AdministeredObject newChild =
          affectedObject.getManagedSubcomponentFromStringRepresentation(newChildStr);
        System.out.println("New child: "+newChild);
      }
      ListIterator e3 = removedChildren.listIterator();
      while (e3.hasNext()) {
        String remChildStr = (String) e3.next();
        AdministeredObject removedChild =
          affectedObject.getManagedSubcomponentFromStringRepresentation(remChildStr);
        System.out.println("Removed child: "+removedChild);
      }
    } catch (ConfigManagerProxyPropertyNotInitializedException ex) {
      ex.printStackTrace();
    }
  }
}

listenForChanges() メソッドは、ブローカー変更を通知するために、MonitorBroker クラスのインスタンスを登録しようとします。 成功すれば、メイン・スレッドは、メソッドが戻されるときにアプリケーションが終了しないように、無制限に休止します。 リスナーが登録されると、ブローカーが変更されるときには (例えば、実行グループが追加される場合)、processModify() メソッドが呼び出されます。 このメソッドにより、各通知の詳細が画面に表示されます。

通知を受け取りたい各管理オブジェクトに対して、個別のリスナーを登録する必要があります。 同じリスナー・インスタンスを複数の管理対象オブジェクトに使用することができます。

以下の 3 つの方法で通知受信を停止することができます。
  • AdministeredObject.deregisterListener(AdministeredObjectListener)
  • ConfigManagerProxy.deregisterListeners()
  • ConfigManagerProxy.disconnect()

最初のメソッドは、単一の管理対象オブジェクトから単一のリスナーを登録解除します。その他の 2 つのメソッドは、BrokerProxy インスタンスと接続されているすべてのリスナーを登録解除します。 さらに、最後のメソッドは、ブローカーへの接続が停止されると、すべてのリスナーが暗黙的に削除されることを示します。

また、AdvancedAdministeredObjectListener インターフェースをインプリメントすることもできます。これが登録されていると、アプリケーションに追加情報を提供します。

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

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

        
        最終更新:
        
        最終更新: 2015-02-28 17:47:05


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