構成マネージャー・プロキシーとオブジェクト通知を使用した、ブローカー・ドメイン管理の結果の検査

これは、構成マネージャー・プロキシー (CMP) アプリケーションの開発という、より大きなタスクの一部です。

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

ユーザー提供コードは AdministeredObjectListener インターフェースをインプリメントしなければなりません。 これは、リスナーが登録されている管理対象オブジェクトでイベントが発生するときに、CMP によって呼び出されるメソッドを定義します。 それらのメソッドは、以下のとおりです。
  • processModify(…)
  • processDelete(…)
  • processActionResponse(…)
processModify(…) は、リスナーが登録されている管理対象オブジェクトが、構成マネージャーによって変更された 1 つ以上の属性を持つ場合に呼び出されます。 processModify() メソッド引数を使用することによってこの通知で提供される情報は、以下のとおりです。
  1. 通知が参照する AdministeredObject へのハンドル。
  2. 変更されたキー名を含むストリングのリスト。
  3. オブジェクトについて作成された新規のサブコンポーネント (例えば、ブローカー内の新規実行グループ) を記述するストリングのリスト。
  4. オブジェクトについて削除されたサブコンポーネントを記述するストリングのリスト。
最後の 2 つのパラメーターに渡されるストリングのフォーマットは、管理対象オブジェクトの内部表記です。 getSubcomponentFromString() メソッドを使用して、この表記を管理対象オブジェクト・タイプに変えることができます。
注:
  1. パフォーマンスを拡張するために、ストリングはこれらのリスト内に渡されます。CMP はリソースがインスタンス化する管理対象オブジェクトが呼び出し側アプリケーションによって具体的に要求されなければ、それらを使用しません。
  2. アプリケーションがバッチ・メソッドを使用している場合、または CMP に構成マネージャーとの通信問題がある場合には、processModify() メソッドがリスナーについて最初に呼び出されるときに、changed attributes パラメーターにオブジェクトの属性名の完全なセットを含めることができます。

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

processActionResponse(…) は、アプリケーションによって実行依頼された以前のアクションが完了したことをアプリケーションに通知するイベントで、CMP アプリケーションによって発行された状態変更操作ごとに受信される 1 つだけの processActionResponse(…) イベントがあります。 以下の情報がこのイベントに対して提供されます。
  1. 要求が実行依頼された管理対象オブジェクトへのハンドル。
  2. 要求の完了コード。
  3. 結果に関連したゼロまたはそれ以上の通知 (BIP) メッセージのセット。
  4. 実行依頼された要求を詳しく記述する (key, value) の対のセット。
最後のパラメーターにある対の構文解析については、「構成マネージャー・プロキシー API Reference」を参照してください。

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

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

public class MonitorTopology implements AdministeredObjectListener {

  public static void main(String[] args) {
        
    ConfigManagerProxy cmp = null;
    try {
      ConfigManagerConnectionParameters cmcp =
         new MQConfigManagerConnectionParameters(
           "localhost",
           1414,
           "");
      cmp = ConfigManagerProxy.getInstance(cmcp);
    } catch (ConfigManagerProxyException cmpex) {
      System.out.println("Error connecting: "+cmpex);
    }
        
    if (cmp != null) {
      System.out.println("Connected to Config Manager!");
      TopologyProxy topology = cmp.getTopology();
      listenForChanges(topology);
      cmp.disconnect();
    }
  }

  private static void listenForChanges(AdministeredObject obj)
  {
    try {
      if (obj != null) {
      	obj.registerListener(new MonitorTopology());
      while(true) {
         // thread could do something else here instead
      	  try {
      Thread.sleep(10000);
      } catch (InterruptedException ex) {
      // ignore
      	  }
        }
      }
    } catch(ConfigManagerProxyPropertyNotInitializedException
                                                      ex) {
        System.err.println("Comms problem! "+ex);
    }    
  }
  
  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) {

    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.getSubcomponentFromString(newChildStr);
      System.out.println("New child: "+newChild);
    }
    ListIterator e3 = removedChildren.listIterator();
    while (e3.hasNext()) {
      String remChildStr = (String) e3.next();
      AdministeredObject removedChild =
        affectedObject.getSubcomponentFromString(remChildStr);
      System.out.println("Removed child: "+removedChild);
    }

  }
}

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

通知の受信を停止するには、以下の 3 つの方法があります。
  • AdministeredObject.deregisterListener(AdministeredObjectListener)
  • ConfigManagerProxy.deregisterListeners()
  • ConfigManagerProxy.disconnect()
最初のメソッドは、単一の管理対象オブジェクトから単一のリスナーを登録解除します。その他の 2 つのメソッドは、ConfigManagerProxy インスタンスと接続されているすべてのリスナーを登録解除します。 さらに、最後のメソッドは、構成マネージャーへの接続が停止されると、すべてのリスナーが暗黙的に削除されることを示します。
注: また、AdvancedAdministeredObjectListener インターフェースをインプリメントすることもできます。これが登録されていると、アプリケーションに追加情報を提供します。
関連タスク
構成マネージャー・プロキシーを使用したブローカー・ドメイン管理の結果の検査
構成マネージャー・プロキシーと戻りコードを使用した、ブローカー・ドメイン管理の結果の検査
構成マネージャー・プロキシーと最後の完了コードを使用した、ブローカー・ドメイン管理の結果の検査
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ae33090_