使用配置管理器代理导航代理域

开始之前

在开始该步骤之前,您必须已完成使用配置管理器连接至配置管理器

可从配置管理器进行控制的每个代理对象表示为配置管理器代理(CMP)中的单个对象,这包括:
  • 代理
  • 执行组
  • 部署的消息流
  • 主题
  • 集合体
  • 预订
  • 发布/预订拓扑
  • 代理事件日志

尽管部署的消息集作为所部署执行组的属性进行处理,但 CMP 也会处理部署的消息集。

这些共同称为受管对象的对象向配置管理器提供主要部分的接口,因此,它们是了解配置管理器 API 的基础。

每个受管对象都是在 配置管理器 中描述底层类型对象的 Java 类的一个实例。 可能的 Java 类如下:
Java 类 类功能
TopologyProxy 描述发布/预订拓扑。
CollectiveProxy 描述发布/预订集合体。
BrokerProxy 描述代理。
ExecutionGroupProxy 描述执行组。
MessageFlowProxy 描述已部署至执行组的消息流;“不”描述工具箱的“代理应用程序开发”透视图中的消息流
TopicProxy 描述主题。
TopicRootProxy 描述主题层次结构的根。
LogProxy 描述当前用户的代理的事件日志。
SubscriptionsProxy 描述活动预订的子集。
ConfigManagerProxy 描述配置管理器本身。
每个受管对象描述从配置管理器进行控制的单个对象。例如,代理域中的每个代理将有一个 BrokerProxy 实例,它在 CMP 应用程序内表示该代理,依此类推。

在每个受管对象中声明的是一组公共方法,程序可以使用这些方法来询问并操作实例所指的底层配置管理器对象的属性。例如,在称为代理 B1BrokerProxy 对象上,可能调用导致该代理显示其运行状态的方法,或调用使该代理启动其所有消息流的方法等等。

要访问受管对象并使用其 API,需要首先从逻辑上拥有该受管对象的对象请求一个它的句柄。例如,当代理逻辑上拥有执行组时,为了获取在代理 B1 上运行的执行组 EG1 的句柄,应用程序必需向由 B1 表示的 BrokerProxy 对象要求由 EG1 表示的 ExecutionGroupProxy 对象的句柄。

ConnectToConfigManager 示例中,将获取 ConfigManagerProxy 对象的句柄。ConfigManagerProxy 逻辑上是受管对象树的根,这表示可从该根直接或间接地访问配置管理器中的所有其他对象。由于配置管理器直接拥有发布/预订拓扑,因此有一个方法应用程序可以从 ConfigManagerProxy 调用,以获取 TopologyProxy 对象的句柄。类似地,由于拓扑逻辑上包含所有代理集,因此可能调用 TopologyProxy 对象上的方法来访问 BrokerProxy 对象。这些访问关系的完整层次结构如下所示:


下列程序将 ConnectToConfigManager 示例用作起点,并遍历受管对象层次结构以查明部署的消息流的运行状态。 请注意,尽管可能用代码中的这些值替换域中的任何有效值,但程序仍假设消息流 MF1 部署至代理 B1 上的 EG1
import com.ibm.broker.config.proxy.*;

public class GetMessageFlowRunState {

  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!");
      displayMessageFlowRunState(cmp, "B1", "EG1", "MF1");
      cmp.disconnect();
    }      
  }

  private static void displayMessageFlowRunState(
                                 ConfigManagerProxy cmp,
                                 String brokerName,
                                 String egName,
                                 String flowName) {
    try {
      TopologyProxy topology = cmp.getTopology();
            
      if (topology != null) {
        BrokerProxy b = topology.getBrokerByName(brokerName);

        if (b != null) {
          ExecutionGroupProxy eg =
            b.getExecutionGroupByName(egName);

          if (eg != null) {
            MessageFlowProxy mf = 
              eg.getMessageFlowByName(flowName);

            if (mf != null) {
              boolean isRunning = mf.isRunning();
              System.out.print("Flow "+flowName+" on " + 
                egName+" on "+brokerName+" is ");

              if (isRunning) {
                System.out.println("running");
              } else {
                System.out.println("stopped");
              }
            } else {
              System.err.println("No such flow "+flowName);
            }
          } else {
            System.err.println("No such exegrp "+egName+"!");
          }
        } else {
          System.err.println("No such broker "+brokerName);
        }
      } else {
        System.err.println("Topology not available!");
      }
    } catch(ConfigManagerProxyPropertyNotInitializedException
                                                      ex) {
      System.err.println("Comms problem! "+ex);
    }
  }
}
完成多数工作的方法是 displayMessageFlowRunState()。 该方法采用先前获取的有效 ConfigManagerProxy 句柄,并查明消息流的运行状态,如下所示:
  1. ConfigManagerProxy 实例用于获取 TopologyProxy 的句柄。由于每个配置管理器都只有一个拓扑,因此 getTopology() 方法不需要用标识限定。
  2. 如果返回有效拓扑,则使用 TopologyProxy 实例获取其 BrokerProxy 对象的句柄,该对象名称由字符串 brokerName 进行描述。
  3. 如果返回有效代理,则使用 BrokerProxy 实例获取其 ExecutionGroupProxy 对象的句柄,该对象名称由字符串 egName 进行描述。
  4. 如果返回有效执行组,则使用 ExecutionGroupProxy 实例获取其 MessageFlowProxy 对象的句柄,该对象名称由字符串 flowName 进行描述。
  5. 如果返回有效的消息流,则将查询 MessageFlowProxy 对象的运行状态并显示结果。
不必知道打算操作的对象的名称。每个受管对象都包含返回其逻辑上拥有的对象集的方法。下列示例通过查找域中的所有代理名来演示该方法:
import java.util.Enumeration;
import com.ibm.broker.config.proxy.*;

public class DisplayBrokerNames {

  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!");
      displayBrokerNames(cmp);
      cmp.disconnect();
    }
  }

  private static void displayBrokerNames(ConfigManagerProxy cmp)
  {
    try {
      TopologyProxy topology = cmp.getTopology();
            
      if (topology != null) {
        Enumeration allBrokers = topology.getBrokers(null);
        
        while (allBrokers.hasMoreElements()) {
          BrokerProxy thisBroker =
            (BrokerProxy) allBrokers.nextElement();
          System.out.println("Broker "+thisBroker.getName());
        }
      }
    } catch(ConfigManagerProxyPropertyNotInitializedException
                                                      ex) {
        System.err.println("Comms problem! "+ex);
    }
  }
}
关键方法是 TopologyProxy.getBrokers(属性)。 当提供了所有空自变量时,它返回域中所有 BrokerProxy 对象的枚举。程序使用该方法来轮流查看 BrokerProxy 并显示其名称。

TopologyProxy.getBrokers(属性) 中的“属性”自变量可以用于精确指定被寻找代理的特征。 对所有返回受管对象的方法都可能执行该操作,并且它在过滤那些程序需要与其结合使用的对象时是一种功能强大的方法。

可以用于过滤对象查找的那些特征的示例是运行状态和简短描述,以及更明显的属性(如名称和 UUID)。为了编写逻辑以实现这点,您必需了解每个受管对象如何存储其信息。

每个受管对象的属性都使用散列表本地存储在对象中,其中每个属性表示为 {键, 值} 元组。每个键是属性的名称(例如,name),每个值是值(例如,BROKER1)。

每个键名称必须使用来自 AttributeConstants 类(com.ibm.broker.config.proxy)的常量表示。每个受管对象的完整的一组键和可能的值在 AttributesConstant 类的 Java 文档中进行描述,或者使用配置管理器代理 API 试验程序样本程序中的显示该对象的原始属性表功能来描述。后者显示每个受管对象的 {键, 值} 对的完整列表。

提供给查找方法的“属性”自变量是必须存在于返回的枚举中每个受管对象里的那些 { 键, 值 } 对的集合。要演示该集合,请请参阅下列代码段:
Properties p = new Properties();
        
p.setProperty(AttributeConstants.OBJECT_RUNSTATE_PROPERTY,
              AttributeConstants.OBJECT_RUNSTATE_RUNNING);

Enumeration e = executionGroup.getMessageFlows(p);
如果变量 executionGroup 是有效 ExecutionGroupProxy 对象,则返回的枚举仅包含运行消息流(OBJECT_RUN_STATE_PROPERTY 等于 OBJECT_RUNSTATE_RUNNING)。
当属性过滤应用于返回单个受管对象(而非对象的枚举)的方法时,仅会返回第一个结果(如果有多个匹配应用,则结果不确定)。这表示:
Properties p = new Properties();

p.setProperty(AttributeConstants.NAME_PROPERTY,
              "shares");

TopicProxy t = topicProxy.getTopic(p);
是以下的备用项:
TopicProxy t = topicProxy.getTopicByName("shares");

如果多个 {键, 值} 对添加到属性过滤器,则所有属性必须按顺序出现在要匹配对象的子对象中。不可能在未编写要执行该操作的特定应用程序代码就执行逻辑 OR 或逻辑 NOT。

AdministeredObjects 在应用程序中首次实例化时,CMP 向配置管理器要求该对象的当前属性集。这将异步发生,表示在 CMP 等待配置管理器提供的信息期间,那里首次请求的属性可能是暂停。 如果信息没有在特定时间(例如,如果配置管理器未处于运行中)内到达,则抛出 ConfigManagerProxyPropertyNotInitializedException。 CMP 等待的最长时间由 ConfigManagerProxy.setRetryCharacteristics() 方法决定。

相关任务
配置用于开发和运行配置管理器应用程序的环境
使用配置管理器连接至配置管理器
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ae33040_