使用带有对象通知的配置管理器代理检查代理域管理的结果

这是部署配置管理器代理(CMP)应用程序中大型任务中的一部分。

每当命令完成,或每当受管对象发生更改时都可以通知应用程序。通过使用 OBSERVER 设计模式,可以将带有句柄的 CMP 提供给用户提供的对象,如果修改、删除对象,或者每当有从配置管理器返回的对先前提交的操作的响应,该用户提供的对象都会调用特定方法。

用户提供的代码必须实现 AdministeredObjectListener 接口。 当在侦听器注册于其上的受管对象上发生事件时,它定义由 CMP 调用的方法。这些方法是:
  • processModify(…)
  • processDelete(…)
  • processActionResponse(…)
processModify(…) 每当配置管理器修改侦听器注册于其上的受管对象的一个或多个属性时,调用该方法。通过使用 processModify() 方法参数在该通知上提供的信息是:
  1. 通知引用的受管对象的句柄。
  2. 包含已更改键名的字符串列表。
  3. 描述为对象刚创建的任何新子组件(例如,代理中的新执行组)的字符串列表。
  4. 描述刚为对象除去的任何子组件的字符串列表。
传递到最后两个参数的字符串的格式是受管对象的内部表示。可能通过使用 getSubcomponentFromString() 方法将该表示转换为受管对象类型。
注:
  1. 字符串在这些列表中传递以增强性能;CMP 不使用资源实例化受管对象,除非它们是由调用应用程序特定请求的。
  2. 首次为侦听器调用 processModify() 方法时,如果应用程序正使用批处理方法,或者如果 CMP 与配置管理器的通信正出现问题,则更改的属性参数可能包含对象属性名的完整集合。

processDelete(…) 如果从配置管理器完全除去侦听器注册于其上的对象,则调用该方法。提供给 processDelete(…) 是一个参数,即已删除的受管对象的句柄;一但该方法返回,则受管对象句柄可能不再有效。大约同时,发生 processDelete(…) 事件,processModify(…) 事件将发送至已删除对象父级的侦听器,以声明子组件的父级列表中的更改。

processActionResponse(…) 通知应用程序由该应用程序提交的先前操作已完成的事件,并且针对 CMP 应用程序发出的每个更改状态的操作,都只收到一个 processActionResponse(…) 事件。 提供给该事件的是下列信息片段:
  1. 已向其提交请求的受管对象的句柄。
  2. 请求的完成代码。
  3. 没有或多条与结果关联的信息的(BIP)消息的集合。
  4. 详细描述已提交请求的一组(键, 值)对。
有关在最后一个参数中解析对的信息,请参考《配置管理器代理 API 参考大全》。

为了注册侦听器,每个受管对象都有 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() 方法。这将在屏幕上显示每个通知的详细信息。

停止接收通知的方法有三种:
  • AdministeredObject.deregisterListener(AdministeredObjectListener)
  • ConfigManagerProxy.deregisterListeners()
  • ConfigManagerProxy.disconnect()
第一种方法注销单个受管对象中的单个侦听器;其他两种方法则是注销与 ConfigManagerProxy 实例相连接的所有侦听器。此外,最后一种方法还显示当停止至配置管理器的连接时,将隐式除去的所有侦听器。
注: 您还可实现 AdvancedAdministeredObjectListener 接口,该接口在注册时向应用程序生成附加信息。
相关任务
使用配置管理器代理检查代理域管理的结果
使用带有返回码的配置管理器代理检查代理域管理的结果
使用带有最新完成代码的配置管理器代理检查代理域管理的结果
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ae33090_