JMX代理连接技术全解析
立即解锁
发布时间: 2025-08-18 02:06:06 阅读量: 3 订阅数: 5 

### JMX 代理连接技术全解析
#### 1. Jini 连接器相关问题及测试
在使用 Jini 连接器连接代理时,存在一些待解决的重要问题。在实现连接器的通知传递机制时,有诸多重要细节需要考虑。同时,要对其进行修改,以便区分运行该类型连接器的多个代理。
##### 1.1 处理通知
在常规的通知场景中,代理会直接调用已注册为通知监听器的对象,从而将通知传递给它。然而,在分布式环境下,通知监听器可能处于远程位置,直接调用可能无法实现。因此,`JINIConnectorClient` 的 `addNotificationListener()` 方法的实现必须有别于常见的 `server.method()` 调用方式。添加监听器的方法必须考虑到连接器的分布式特性。解决此问题的最佳方式是让 `JINIConnectorClient` 实例在本地存储监听器引用,并将自身添加为通知监听器。或者,客户端也可以是一个远程对象,在这种情况下,远程 MBean 可以将通知传递给客户端,客户端再根据需要将其分发给本地监听器。
##### 1.2 Jini 连接器属性
假设有两个活跃的 JMX 代理,它们都使用 Jini 连接器,以便远程客户端能够发现它们。这两个代理需要确保由 Jini 连接器创建的各自 Jini 服务具有唯一的标识。`JINIServer` MBean 允许代理为服务设置单个属性。`JINIServer` MBean 应始终使用这些属性来构建 Jini 服务,以使其尽可能唯一。此外,`JINIConnectorClient` 需要一段代码,允许用户在客户端开始搜索 Jini 服务时输入可能的属性值。这段代码将帮助客户端用户更精准地搜索远程 JMX 代理。
##### 1.3 测试 Jini 连接器
在了解了 Jini 连接器的所有组件后,接下来要进行测试。为了测试该连接器,需要对 `JMXBookAgent` 类进行修改。为代理添加 `startJINIConnector()` 方法,而对于客户端,则使用 `JINIConnectorClient` 类的 `main` 方法。通常,客户端会创建一个 `JINIConnectorClient` 类的实例来使用。以下是 `startJINIConnector()` 方法的代码:
```java
protected void startJINIConnector()
{
ObjectName connectorName = null;
try
{
System.setSecurityManager( new RMISecurityManager() );
JINIServer jini = new JINIServer();
ObjectName jiniName = null;
jiniName =
new ObjectName( "JMXBookAgent:name=JINIConnector" );
server.registerMBean( jini, jiniName );
jini.enableConnections();
}
catch(Exception e)
{
e.printStackTrace();
}
}
```
该方法会创建一个连接器 MBean(`JINIServer` 类)的实例和一个新的 `ObjectName` 实例,并将 MBean 注册到 MBean 服务器上。最后,调用 MBean 的 `enableConnections()` 方法,在其中创建并启动 Jini 服务。
##### 1.4 运行示例
编写完所有代码后,需要对该连接器进行测试。要编译和运行该连接器,必须从 http://www.javasoft.com 下载最新的 Jini 开发工具包。下载完成后,按照以下步骤测试连接器:
1. 编译 `jmxbook.ch9` 包。编译代理时,需要将 JMX JAR 文件、`contrib/jars` 文件夹中的 `JMX_remoting.jar` 文件以及 Jini JAR 文件添加到 `CLASSPATH` 中。编译连接器源文件时,同样需要将 JMX JAR 文件和 Jini JAR 文件添加到 `CLASSPATH` 中。此外,必须使用 `rmic` 编译器为 `JINIConnectorImpl` 类生成存根。
2. 设置 Jini 环境。这包括启动一个 HTTP 服务器、启动 Java 激活守护进程(`rmid`)以及启动一个 Jini 查找服务。具体操作步骤可参考 Jini 文档。
3. 启动 JMX 代理。在启动代理时,需要在 `java` 命令中使用 `-Djava.security.policy` 属性指定一个策略文件。
4. 运行客户端类(`JINIConnectorClient`)。这将调用该类的 `main()` 方法。该方法将使用 `JINIConnector` 查找 JMX 代理,获取其 MBean 计数,并在代理上创建一个新的 `HelloWorld` MBean。
查看此简单测试结果的最佳方式是在代理仍在运行时,打开浏览器并访问 http://localhost:9092(假设与代理在同一台机器上)。此时,应该可以看到所有三个适配器/连接器 MBean(HTML、RMI 和 Jini)以及一个新的 `HelloWorld` MBean。
#### 2. JMX 与 SNMP
许多供应商已经分发了大量具备 SNMP 管理功能的设备。如果能够将现有的管理基础应用到正在构建的新应用程序和系统中,那将是非常理想的。例如,网络应用程序在做出路由决策之前,可以先了解所需硬件的健康状况。在这种情况下,使用现有的 SNMP 技术是很有意义的。幸运的是,由于 JMX 架构的灵活性,JMX 代理可以通过 SNMP 适配器公开 MBean。
##### 2.1 什么是 SNMP
SNMP(Simple Network Management Protocol,简单网络管理协议)是一种已经广泛使用多年的监控标准。不过,大多数开发者可能会认为它并不简单。目前已经存在两个版本的 SNMP(v1 和 v2),而第三个版本正在由互联网工程任务组(IETF)进行定义。
在 SNMP 系统中,存在着各种被管理的设备,如路由器、集线器、计算机、操作系统,甚至是应用程序。基本上,任何能够公开自身信息的设备或系统都可以成为被管理设备。SNMP 代理的作用是将来自 SNMP 协议的请求或消息转换为设备能够理解的形式。网络管理系统(NMS)会向代理发送信息,并监听来自代理的信息。
SNMP 为 NMS 与被管理设备之间的通信提供了能力。SNMP API 有两个命令:读取和写入。读取命令用于向代理发送请求,以获取被管理设备的当前状态信息;写入命令则用于设置被管理设备的状态。同样,被管理设备可以通过发送 SNMP 陷阱(trap)向 NMS 发出某些有趣事件发生的信号。陷阱相当于 JMX 中的通知。
关于被管理设备的信息存储在管理信息库(MIB)中。MIB 是设备信息的层次化表示。可以使用对象名称或对象标识符在 MIB 树中定位被管理设备,例如 `organization.dod.enterprise.myenterprise.variables.theProduct`。对象标识符是一组数字,可转换为文本名称。有关 MIB 的更多信息,可参考 http://www.ietf.org 上的 SNMP 规范。
由于互联网上的机器存在兼容性问题,数据必须使用中立的表示形式进行交换。为此,开发了一种名为抽象语法标记一号(ASN.1)的标准来实现这种交换。利用这种标记,人们创建了用于定义管理信息的规则,即管理信息结构(SMI)。SMI 定义了一些简单类型,如整数、八位字节字符串和对象 ID,还定义了一些应用数据类型,如网络地址、计数器、计量器、时间刻度、不透明数据、整数和无符号整数。
##### 2.2 使用 SNMP 协议适配器
与任何协议或传输技术一样,灵活的 JMX 架构使代理能够与 SNMP 管理应用程序进行通信。SNMP 适配器将 MBean 中的数据转换为 SNMP MIB,并使用 SNMP 协议将信息传输给感兴趣的监听器。
Sun Microsystems 提供了一个包含在 JDMK 中的 SNMP 适配器实现以及一个工具套件。该工具包具备使用 SNMP 协议适配器开发 JMX 代理的能力。使用一个名为 `mibgen` 的工具,可以生成表示 SNMP MIB 的 MBeans。`mibgen` 工具会根据现有的 MIB 定义为你创建 Java 对象。甚至还有一个使用管理 API 构建 NMS 的工具包。
SNMP 协议适配器可以与 SNMP v1 和 SNMP v2 协议一起工作。当协议适配器接收到来自 SNMP 系统的请求时,它会将这些请求映射到特定的 MBean 操作并执行它们。此外,协议适配器可以代替 JMX 通知向 NMS 发送 SNMP 陷阱。
通过使用 SNMP 协议适配器,NMS 可以访问 MBean 服务器中表示各种 MIB 的 MBeans。虽然 SNMP 不支持 JMX 的丰富功能,但可以构建支持 SNMP 所有功能的 MBeans。这意味着 MBeans 可能具有比通过 SNMP 所能访问的更多功能,但现有的 NMS 系统可以利用那些符合 SNMP 标准的公开功能。Java 社区过程(JCP)正在努力对 JMX 与现有 SNMP 标准之间的映射进行标准化。
如需了解更多关于 SNMP 协议适配器和 JDMK 的信息,可访问 Sun 网站上的 JDMK 产品页面(http://java.sun.com/products/jdmk)。
#### 3. 使用 TCP 适配器进行连接
到目前为止,已经了解了多种不同的技术,可用于分布式访问 JMX 代理。例如,可以使用 Sun 提供的 RMI 连接器,也可以使用 Jini 让代理能够被发现。接下来,将编写一个 TCP 协议适配器。
需要注意的是,这里不会使用任何对象序列化,因为不希望创建一个类似 RMI 的连接器。相反,TCP 适配器是一个基于套接字的适配器,它允许任何有能力的客户端连接并发送简单命令,从而与代理进行交互。这种命令方式使得非 Java 客户端也能够连接到代理并与 MBeans 进行交互。例如,一个 C++ 程序可以打开一个套接字连接到远程代理,并从现有的 MBeans 中获取属性值。
本部分介绍的 TCP 适配器可以创建 MBeans、获取和设置属性以及调用操作。不过,它对客户端发送参数的顺序和方式有一些限制,在后续的代码分析中会详细说明。该适配器被建模为一个 MBean,它会创建一个 `ServerSocket` 对象,用于监听特定的端口。当客户端连接时,MBean 会在一个新的线程中创建一个 `TCPAdapter` 对象来处理客户端请求,同时继续监听其他客户端的连接。
##### 3.1 编写代码
为了完成这个新的协议适配器,需要创建三个类和一个接口:
- `TCPServerMBean`:这是一个 MBean 接口,声明了该适配器公开的方法。
- `TCPServer`:实现了 `TCPServerMBean` 接口,并创建 `ServerSocket`。
- `TCPAdapter`:由 `TCPServer` 创建,用于处理每个传入的客户端请求。
- `TCPTester`:用于测试 TCP 适配器的类。
首先,编写 `TCPServer` MBean 的 MBean 接口:
```java
package jmxbook.ch9;
public interface TCPServerMBean
{
public void setPort( int port );
public int getPort();
public boolean start();
public boolean stop();
}
```
`TCPServerMBean` 接口声明了两个操作和一个读写属性。`Port` 属性是 `ServerSocket` 监听传入客户端请求的端口号。`start()` 方法用于启动 `ServerSocket`,并让 MBean 开始监听。而 `stop()` 方法则用于关闭 `ServerSocket`,并停止 `TCPServer` MBean 接收任何新的客户端连接。不过,现有的客户端在关闭其连接之前仍可以继续访问代理。
以下是 `TCPServer` 类中 `TCPServerMBean` 接口的实现代码:
```java
package jmxbook.ch9;
import javax.management.*;
import java.net.*;
public class TCPServer imple
```
0
0
复制全文
相关推荐










