技术开发 频道

使用JMX 接口来编写PMI 应用程序

 如何通过 JMX 接口获取 PMI 数据

  下面通过一些样本代码来说明通过 JMX 接口获取 PMI 数据的步骤。这些步骤包括:

  创建一个 AdminClient 实例

  查找 PerfMBean 和各种 MBean

  设置装备级别

  从单个 MBean 中获取 PMI 数据

  从多个MBeanStatDescriptor 获取 PMI 数据

  检索静态配置信息

  从 Stats 对象获取各种 PMI 计数器。

  步骤 1:创建一个 AdminClient 实例

  在 WebSphereApplication Server V5 中,所有的远程 JMX 调用都是通过 AdminClient 接口实现的,该接口通过代理提供客户端 API给 JMX 客户机并代发所有的调用给服务器端的 JMX 连接器。当前支持的连接器是 SOAP 和 RMI 连接器。

  您需要通过合适的主机名、端口号和连接器类型才能创建 AdminClient 实例。以下的代码样本创建一个名为“ac”的 AdminClient实例,在后面的步骤中会用它来查询 JMX、从 MBean 获取 Stats,以及调用 MBean 中的方法。

1 AdminClient ac = null;
2 java.util.Properties props = new java.util.Properties();
3 props.put(AdminClient.CONNECTOR_TYPE,connector);
4 props.put(AdminClient.CONNECTOR_HOST,host);
5 props.put(AdminClient.CONNECTOR_PORT,port);
6 try {
7 ac = AdminClientFactory.createAdminClient(props);
8 } catch (ConnectorException ex) {
9 System.out.println("Exception to create AdminClient: " + ex);
10 }
11

  步骤 2:查找 PerfMBean 和各种 MBean

  每个 MBean 都有一个 ObjectName,在使用该 MBean之前必须先找到它。ObjectName 可以通过 AdminClient,以格式化的查询串进行查询。格式化的查询串可以选择性地包括以下的特性:域名、节点名、进程名、类型、名称等等。一个查询串既可惟一标识单个ObjectName,也可以代表多个具有公共特性的 ObjectName。MBean 通常是以它们的类型进行分类的。

  如果 PMI服务在某一应用服务器上可用,那么在该服务器上有且仅有一个类型为“Perf”的 MBean (PerfMBean),它为 PMI 服务配置和 PMI数据恢复提供了扩展的功能。以下的代码将会返回服务器中的 PerfMBean 的 MBean ObjectName。

1 StringBuffer oNameQuery= new StringBuffer();
2   // "Perf" can be replaced by other types to find MBeans in those types
3 String domainName = ac.getDomainName();
4 oNameQuery.append(domainName).append(":*");
5 oNameQuery.append(",type=").append("Perf");
6 oNameQuery.append(",node=").append(mynode);
7 oNameQuery.append(",process=").append(myserver);
8 Set oSet= ac.queryNames(new ObjectName(oNameQuery.toString()),null);
9 Iterator i = oSet.iterator ();
10 ObjectName perfOn = null;
11 if (i.hasNext ()) {
12 perfOn=(ObjectName) i.next();
13 }
14

  可以对以上的代码稍加修改,为 oNameQuery添加不同的特性和值就可以查询与该查询规则相匹配的其他 MBean ObjectName。例如,您可以将 Perf 替换为 Servlet , 这样您就会得到服务器中所有 servlet 的一组 ObjectName。

1 oNameQuery.append(",type=").append("Servlet");
2

  我们也可以传递其他 MBean 类型来查找相关的 MBean。一些 MBean 类型(例如,Perf)会在应用服务器中提供单个的实例,但其他 MBean类型(例如,servlet 和 EJB)会在应用服务器中提供多个实例。在后面的情况中,MBean可以由它的名字进一步地识别。例如,可以在查询串中添加以下一行来查找名字准确为“myServletName”的 ObjectName。

1 oNameQuery.append("name=").append(myServletName);
2

  请保留对本步骤中找到的 ObjectName 的引用,因为这些 ObjectName 以下步骤将会使用到。

  步骤 3:设置装备级别

  缺省情况下并没有设置 PMI 的装备级别。因此,必须将PMI 数据设置为适当的装备级别(通过程序、使用管理控制台或是使用管理脚本均可设置)。不管哪种方法,级别设置均可立即生效,无需重启服务器。

  以下代码显示了如何通过 PerfMBean 在程序中设置 MBean 的装备级别:通过传递 MBean 的 ObjectName (从步骤 2中得到)、一个可选的 StatDescriptor(在本例中为空)以及期望的级别来构建它的一个 MBeanLevelSpec 对象,StatDescriptor是用于指定该 MBean 中的 PMI 数据的一个子集,在步骤 5 中将会对它进行描述。请注意可以使用多个 ObjectName 来创建一批MBeanLevelSpec,它们可以同时传递来设置多个 MBean 的装备级别。

1 // First,set the parameter and signature arrays
2 Object[] params = new Object[2];
3 params[0] = new MBeanLevelSpec(mbeanObjectName,null
4 PmiConstants.LEVEL_HIGH);
5 params[1] = new Boolean(true);
6 String[] signature= new
7 String[]{"com.ibm.websphere.pmi.stat.MBeanLevelSpec""java.lang.Boolean"};
8 ac.invoke(perfOn,"setInstrumentationLevel",params,signature);
9

  步骤 4: 从单个 MBean 获取 PMI 数据

  如果一个单个的 MBean 提供了 Stats 属性,那么一旦在步骤 2 中得到了 ObjectName,就可以通过从 MBean中获取 Stats 属性来得到相关的 PMI 数据。再一次注意,通过各个 MBean 并不能设置装备级别。

1 Stats aStats = (Stats)ac.getAttribute(mbeanObjectName,"Stats");
2

  步骤 5:从 PerfMBean 获取 PMI 数据

  在步骤 4 中,一次 getAttribute 调用只能从某一 MBean 得到一个 Stats 对象。要从多个 MBean 得到 Stats对象,您需要多次调用 getAttribute。由于 getAttribute 是一个远程 JMX 调用,多次调用会带来很大的通信开销。PerfMBean被设计为可以以一种更为有效和灵活的方式来进行数据访问。PerfMBean 提供了以下的数据访问方法:

0
相关文章