级别: 初级 Roger Cundiff (rcundiff@us.ibm.com), IBM WebSphere Application Server Development, 德克萨斯州奥斯汀市
2003 年 4 月 01 日 第 2 部分探讨管理客户机 API,并讨论如何用它来开发您自己的定制的管理客户机程序。
© Copyright International Business Machines Corporation 2003. All rights reserved.
介绍
IBM® WebSphere® Application Server(以下称为 Application Server)版本 5.0 在可伸缩性、可靠性、Web 服务、J2EE 1.3 认证以及其它许多方面都有所增强。版本 5.0 还将提供完全重写过的基础架构,以便您管理您的服务器和应用程序。作为一种基于开放式标准的管理框架,Java Management Extensions(JMX)是版本 5.0 的核心管理功能。这一框架将用于为版本 5.0 构建的新的管理工具集。而且,您可以将版本 5.0 管理工具功能用于您自己的定制的管理程序。
这几篇有关系统管理的系列文章将讨论各种使用 Application Server 5.0 管理功能的方式。
第 1 部分介绍了理解 5.0 特性所需的系统管理的基本概念。这就包括了对 Application Server 5.0 的新的基于 JMX 的管理体系结构以及对各种可用于管理 Application Server 系统的工具讨论。第 2 部分探讨管理客户机 API,并讨论如何用它来开发您自己的定制的管理客户机程序。
JMX 概述
在您开始开发样本管理客户机程序之前,熟悉 JMX 对您而言是很重要的。
JMX 是对应用程序的资源进行管理的 Java 标准。JMX 所定义的管理体系结构分为三层:
-
最下层是管理仪表化。由一个接口来描述每个可管理的资源,该接口指定资源具有的属性、支持的操作以及发出的通知。这种资源是受管 bean(managed bean,MBean)。
-
中间层是管理代理。每个受管进程都包含一个 JMX 代理,每个 JMX 代理包括一个 MBean 服务器,它将为 MBean 提供注册中心和访问点。管理客户机必须使用 MBean 服务器来访问注册过的 MBean。
- 体系结构的
最上层虽然已被确定,但在目前这个级别的 JMX 规范中没有对其予以定义。它是分布式服务层,其角色是使远程访问 JMX 代理更为容易。此任务通过连接器来完成,连接器将提供一个到 MBean 服务器的协议无关、位置透明的客户端接口(比如,一个 RMI 连接器)或者提供一个到 MBean 服务器的特定于协议、服务器端访问的协议适配器(比如,一个 HTTP 适配器)。
图 1. JMX 体系结构
若需要有关使用 JMX 编程的更多详细信息,请参阅
相关信息部分。
WebSphere Application Server 中的 JMX
JMX 是 Application Server 的核心管理功能。应用服务器包含有一个 JMX 代理。所有系统组件都被当作 MBean 受到监控。Application Server 的 JMX 代理支持两类连接器,分别是 RMI/IIOP 和 SOAP/HTTP(S),该代理提供对服务器的资源的远程访问。Application Server 所含的所有管理工具都使用这些 JMX 工具来实现其功能。
记得在
第 1 部分中曾说过,在 Application Server 基本安装中,服务器的存在与管理都是单独的。在这样的环境中,管理客户机直接连接到应用服务器。而且,您还应该记得在 Network Deployment 安装中,多级拓扑结构对节点内的应用服务器进行分组,并对单元内的节点进行分组。管理服务器存在于节点级(节点代理)以及单元级(部署管理器),并且为其下属服务器中的管理服务担当聚集点。通过节点代理,一个节点上的所有服务器中的 MBean 都是可见的,而所有节点中的 MBean 通过部署管理器都是可见的。因此,通过连接到部署管理器,您可以调用操作,获得和设置属性,以及为单元内任何 MBean 接收通知。Application Server 提供了一个 AdminService 类,这个类将映射标准 JMX MBeanServer 接口,并封装 MBeanServer,以使它能参与这种分布式管理功能的实现。
图 2. WebSphere Application Server 管理拓扑
获取 AdminClient
由于您将要写一个客户机程序,所以您需要连接到希望连接的服务器,并需要调用远程 MBean 上方法的办法。AdminClient 类可以提供这些功能。在创建 AdminClient 对象时,它通过所支持的 JMX 连接器之一提供了远程 AdminService 对象的代理。作为远程 AdminService 的代理,AdminClient 也将映射 MBeanServer 接口。不过,AdminClient 不包括在连接的客户端不适用的 MBeanServer 方法。
使用下面的代码来创建连接到服务器上的 AdminClient 对象:
清单 1. 创建 AdminClient
Properties clientProps = new Properties();
connectProps.setProperty(AdminClient.CONNECTOR_TYPE,
AdminClient.CONNECTOR_TYPE_SOAP);
connectProps.setProperty(AdminClient.CONNECTOR_HOST, "localhost");
connectProps.setProperty(AdminClient.CONNECTOR_PORT, "8879");
AdminClient adminClient = null;
try
{
adminClient = AdminClientFactory.createAdminClient(clientProps);
}
catch (ConnectorException e)
{
System.out.println("Exception creating admin client: " + e);
}
|
首先,建立一个 Properties 对象,它具有连上您希望的服务器所需要的属性。在这种情况下,您会使用 SOAP 连接器来连上服务器;对于连接器类型,使用值
AdminClient.CONNECTOR_TYPE_SOAP 。为了简洁起见,您可以在服务器所在的那台机器上运行客户机程序;主机名使用
localhost 。为了访问远程主机而非本地主机,只要使用那台主机的可解析网络名称。您需要设置的最后一个属性是服务器的 SOAP 连接器侦听的端口号。在单服务器安装中,应用程序服务器的 SOAP 连接器的缺省端口号是
8880 。在 Network Deployment(网络部署)安装中,部署管理器的 SOAP 连接器的缺省端口号是
8879 。
在设好连接属性后,您可以使用 AdminClientFactory 类和 Properties 对象来创建一个 AdminClient 对象,可把它连接到您选择的服务器上。根据您需要的协议和安全性环境一类的因素,您可能会需要设置其它属性。若需要有关 AdminClient 接口的更多详细信息及其它的创建示例,请参考
AdminClient javadoc。
访问 MBean
一旦您获得一个
AdminClient 实例,就可用它来访问应用程序服务器和管理服务器中的受管资源。每个受管资源在其进程中都要向 MBeanServer 注册一个 MBean。在 JMX 中,管理程序不直接访问 MBean。相反,它们必须直接向 MBeanServer 请求,然后通过名称引用 MBean。MBean 的名称采用 ObjectName 的形式,它由一个域名、后跟一个无序表(这是一个有一个或多个关键属性(key properties)的表)组成。语法是这样:
[domainName]:property=value[,property=value]*
|
域名将提供 ObjectName 名称空间在 JMX 代理中的分区。它是可选的,如果它没有出现,那么 MBean 服务器将使用缺省的域名。对于 WebSphere Application Server,域名采用
WebSphere 比较方便。
一个关键属性是名称-值对。ObjectName 的关键属性列表可以由任意数目的关键属性构成,但是至少需要一个。关键属性在列表中的次序并不重要。下面的表格将展示 WebSphere Application Server 管理用到的最为重要的关键属性名称:
表格 1. WebSphere Application Server 中的 ObjectName 关键属性名称
|
type
| MBean 代表的资源类型 | |
name
| 单个 MBean 实例的名称标识符 | |
cell
| MBean 执行时所在的单元名称 | |
node
| MBean 执行时所在的节点名称 | |
process
| MBean 执行时所在的进程名称 |
Application Server 中有一些 MBean 使用其它的关键属性。不过,上面的表格包含了最重要的部分,是最起码要具备的关键属性。一个没有这些关键属性的 MBean 可以在一个 Application Server 进程中向 MBeanServer 注册,但是这样的 MBean 不能参与 Application Server 增加的分布式增强(比如,请求路由、分布式事件通知等)。
如果您知道一个 ObjectName 的全部关键属性的集合,那么您可以用这个集合来寻找它所标识的 MBean。不过,通常不必知道 MBean 的全部关键属性寻找 MBean 较为实际、方便。对于不需要匹配的关键属性,您都可以通过使用通配符
* 来表示,以做到这一点。下面的表格将会提供一些 ObjectName 的示例,其通配符关键属性可以匹配一个或多个 MBean。
表格 2. 带通配符关键属性的 ObjectName 的示例
| *:type=Server,* | 所有类型为 Server 的 MBean | | *:node=Node1,type=Server,* | Node1 上所有类型为 Server 的 MBean | | *:type=JVM,process=server1,node=Node1,* | 节点 Node1 上叫做 server1 的服务器上的 JVM MBean | | *:process=server1,* | 所有叫做 server1 的服务器上的所有 MBean | | *:process=server1,node=Node1,* | 节点 Node1 上叫做 server1 的服务器上的所有 MBean |
下面的示例将展示如何找到叫做
MyNode 的节点的 NodeAgent MBean:
清单 2. 节点代理 MBean 的寻找
String nodeName = "MyNode";
ObjectName queryName = new ObjectName
("WebSphere:*,type=NodeAgent,node=" + nodeName);
ObjectName nodeAgent = null;
Set s = adminClient.queryNames(queryName, null);
if (!s.isEmpty())
nodeAgent = (ObjectName)s.iterator().next();
else
System.out.println("Node agent MBean was not found");
|
开始先使用指定类型(type)和节点(node)的关键属性的查询字符串构建一个 ObjectName。通过使用一个通配符来表示剩余的关键属性,该模式将对 MyNode 节点上类型为 NodeAgent 的所有 MBean 的 ObjectName 进行匹配。由于每个节点只有一个节点代理,因此这足以识别您所要的 MBean。然后,把这个 ObjectName 给 AdminClient 的 queryNames 方法,它将执行对 AdminService 的远程调用,以获得与查询匹配的 MBean ObjectName 集合。(这个方法的第二个参数为 null(空),它是一个查询表达式(QueryExp)对象,可以用于对与第一个参数中 ObjectName 模式相匹配的 MBean 进行另外的查询。)最后,使用这个集合的迭代器取得第一个(而且,是本例中唯一的)元素,这就是节点代理的 MBean ObjectName。
因此,既然您能访问 MBean 了,那么您可以做些什么呢?
使用 MBean
特定的 MBean 让您做些什么取决于它所公开的管理接口。它可能会声明您可以得到或设置的属性。它可能会声明您可以调用的操作。它还可能会声明您可以为之注册侦听器的通知。关于 Application Server 所提供的 MBean,您可以在
MBean javadoc中找到有关它们所支持的接口的信息。这个 javadoc 也随 Application Server 一起安装在了产品安装根目录下的
\web 子目录中。
调用操作
下面的示例将要调用的是您在上面找到的 NodeAgent MBean 上可用的操作之一。它会启动叫做
MyServer 的应用服务器:
清单 3. 调用 MBean 操作
String opName = "launchProcess";
String signature[] = { "java.lang.String" };
Object params[] = { "MyServer" };
try
{
adminClient.invoke(nodeAgent, opName, params, signature);
}
catch (Exception e)
{
System.out.println("Exception invoking launchProcess: " + e);
}
|
AdminClient.invoke 方法是调用任何 MBean 上的任何操作的一般方法。参数有:
- 目标 MBean 的 ObjectName
- 操作的名称
- 一个包含操作参数的 Object 数组
- 以及一个包含操作签名的 String 数组
在这种情况下,launchProcess 操作有一个参数:一个标识将要启动的服务器的字符串。
调用方法将返回一个 Object 实例,然后发出调用的代码可把这个实例强制转换成对所调用的操作来说正确的返回类型。launchProcess 操作被声明为空,因此在这个示例中您可以忽略返回值。
注册为事件通知侦听器
除对资源进行管理外,JMX 还支持对特定的管理事件进行监视。某些事件会生成通知,比如,在启动服务器时。管理应用程序也许会通过注册为一个通知侦听器来表示其对这些事件的兴趣。WebSphere Application Server 可提供 JMX 通知模型的完整实现,并提供另外的功能以使您可以在分布式环境中接收通知。若需要 WebSphere Application Server MBean 所发出通知的列表,请参考 Javadoc 中的
NotificationConstants类。关于一个对象如何为从您的节点代理 MBean 发出的事件通知而注册自己,下面就是这样的一个示例:
清单 4. 通知侦听器的注册
adminClient.addNotificationListener(nodeAgent, this, null, null);
|
在这个示例中,第一个参数是节点代理 MBean 的 ObjectName。第二个参数标识必须实现 NotificationListener 接口的侦听器对象。在这种情况下,发出调用的对象是侦听器。第三个参数是一个过滤器,您可以用它指出想要接收哪些通知。如果您保留这个值为
null ,您将会接收到来自这个 MBean 的所有通知。最后一个参数是一个 handback 对象,您可以这样设置 JMX,当它发出一个通知时,就把这个对象返回给你。
如果您的 MBean 的位置在单元内的另一台服务器上,即使您的管理客户机程序可能被连接到部署管理服务器,您仍可以接收到这个程序的通知。这是因为所有通知都流向上行服务器。比如,来自应用程序服务器的一个通知首先会流到本地节点代理,然后从那里流向部署管理器。
Application Server 提供的另一个增强功能是,通过一个调用注册为多个 MBean 的通知侦听器的能力。通过 AdminClient 的 addNotificationListenerExtended 方法就可以做到这一点,addNotificationListenerExtended 是标准 JMX addNotificationListener 方法的扩展。这个扩展方法甚至让您为当前不活动的 MBean 注册。有些情况下,在您的管理客户机程序生命周期内有些资源会被停止或重新启动,如果您想监视来自这些资源的事件时,这一点很重要。
处理事件通知
对象通过 handleNotification 方法接收 JMX 事件通知,该方法由 NotificationListener 接口定义,而且任何一个事件接收器都必须实现它。下面的示例是 handleNotification 的实现,它会报告所接收到的通知:
清单 5. 通知的接收
public void handleNotification(Notification n, Object handback)
{
System.out.println("******************************************");
System.out.println("* Notification received at "
+ new Date().toString());
System.out.println("* type = " + n.getType());
System.out.println("* message = " + n.getMessage());
System.out.println("* source = " + n.getSource());
System.out.println("* seqNum = "
+ Long.toString(n.getSequenceNumber()));
System.out.println("* timeStamp = " + new Date(n.getTimeStamp()));
System.out.println("* userData = " + n.getUserData());
System.out.println("*******************************************");
}
|
汇总
现在您可以编译管理客户机程序了。为了做到这一点,您只需运行
javac 并设置类路径,以得到必要的 JMX 和 WebSphere Application Server JAR 文件。通常 JAR 文件由
jmxc.jar 、
admin.jar 和
wsexception.jar 组成。如果 Application Server 被安装在
w:\DeploymentManager 下,那么
javac 命令会是下面这样子:
javac -classpath w:\DeploymentManager\lib\admin.jar;
w:\DeploymentManager\lib\wsexception.jar;
w:\DeploymentManager\lib\jmxc.jar AdminClientExample.java
|
请查看
下载ZIP 文件,其中是一个包含本文所有示例的完整的管理客户机程序。
运行程序
通过建立运行时环境以便该程序可以将需要的必要文件全部找到,从而运行您的管理客户机程序。Application Server 安装根目录下的
\bin 目录中的许多批处理文件或脚本文件执行相似的功能。下面的代码片断是一个 Windows® 批处理文件示例,这个文件将运行一个叫做
AdminClientExample 的管理客户机程序;它被打包在了一个同名的 JAR 文件中。它使用安装在 Application Server
\bin 目录下的
setupCmdLine.bat 脚本来建立此过程必需的环境:
清单 6. 启动管理客户机程序
@echo off
call "%~dp0setupCmdLine.bat"
"%JAVA_HOME%\bin\java" -classpath "%WAS_CLASSPATH%;
%WAS_HOME%\lib\admin.jar;%WAS_HOME%\lib\wasjmx.jar;
c:\test\AdminClientExample.jar" AdminClientExample %*
|
结束语
在 WebSphere Application Server 的版本 5.0 中,管理功能已经有了很大的增强。JMX 为这些增强提供基础。本文中提供的代码样本演示了如何从客户端开始在 Application Server 中使用 JMX。为了继续探讨 WebSphere Application Server 和 JMX,请仔细查看下面的 URL 并静候这一系列的剩余部分。
相关信息
下载 | 名字 | 大小 | 下载方法 |
|---|
| AdminClientExample.zip | 0.002 MB | HTTP |
关于作者  | |  |
Roger Cundiff是 IBM 的一名顾问软件工程师,在位于德克萨斯州奥斯汀市的 WebSphere Application Server 开发机构工作。在过去的五年中,他一直在为基于组件的软件产品开发管理系统。您可以通过
rcundiff@us.ibm.com与 Roger 联络。
|
对本文的评价
|