开始之前
在开始该步骤之前,您必须已完成使用配置管理器连接至配置管理器。
尽管部署的消息集作为所部署执行组的属性进行处理,但 CMP 也会处理部署的消息集。
这些共同称为受管对象的对象向配置管理器提供主要部分的接口,因此,它们是了解配置管理器 API 的基础。
Java 类 | 类功能 |
---|---|
TopologyProxy | 描述发布/预订拓扑。 |
CollectiveProxy | 描述发布/预订集合体。 |
BrokerProxy | 描述代理。 |
ExecutionGroupProxy | 描述执行组。 |
MessageFlowProxy | 描述已部署至执行组的消息流;“不”描述工具箱的“代理应用程序开发”透视图中的消息流。 |
TopicProxy | 描述主题。 |
TopicRootProxy | 描述主题层次结构的根。 |
LogProxy | 描述当前用户的代理的事件日志。 |
SubscriptionsProxy | 描述活动预订的子集。 |
ConfigManagerProxy | 描述配置管理器本身。 |
在每个受管对象中声明的是一组公共方法,程序可以使用这些方法来询问并操作实例所指的底层配置管理器对象的属性。例如,在称为代理 B1 的 BrokerProxy 对象上,可能调用导致该代理显示其运行状态的方法,或调用使该代理启动其所有消息流的方法等等。
要访问受管对象并使用其 API,需要首先从逻辑上拥有该受管对象的对象请求一个它的句柄。例如,当代理逻辑上拥有执行组时,为了获取在代理 B1 上运行的执行组 EG1 的句柄,应用程序必需向由 B1 表示的 BrokerProxy 对象要求由 EG1 表示的 ExecutionGroupProxy 对象的句柄。
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 句柄,并查明消息流的运行状态,如下所示:
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() 方法决定。