活动介绍

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 ```
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

编程中的数组应用与实践

### 编程中的数组应用与实践 在编程领域,数组是一种非常重要的数据结构,它可以帮助我们高效地存储和处理大量数据。本文将通过几个具体的示例,详细介绍数组在编程中的应用,包括图形绘制、随机数填充以及用户输入处理等方面。 #### 1. 绘制数组图形 首先,我们来创建一个程序,用于绘制存储在 `temperatures` 数组中的值的图形。具体操作步骤如下: 1. **创建新程序**:选择 `File > New` 开始一个新程序,并将其保存为 `GraphTemps`。 2. **定义数组和画布大小**:定义一个 `temperatures` 数组,并设置画布大小为 250 像素×250 像

ApacheThrift在脚本语言中的应用

### Apache Thrift在脚本语言中的应用 #### 1. Apache Thrift与PHP 在使用Apache Thrift和PHP时,首先要构建I/O栈。以下是构建I/O栈并调用服务的基本步骤: 1. 将传输缓冲区包装在二进制协议中,然后传递给服务客户端的构造函数。 2. 构建好I/O栈后,打开套接字连接,调用服务,最后关闭连接。 示例代码中的异常捕获块仅捕获Apache Thrift异常,并将其显示在Web服务器的错误日志中。 PHP错误通常在Web服务器的上下文中在服务器端表现出来。调试PHP程序的基本方法是检查Web服务器的错误日志。在Ubuntu 16.04系统中

AWSLambda冷启动问题全解析

### AWS Lambda 冷启动问题全解析 #### 1. 冷启动概述 在 AWS Lambda 中,冷启动是指函数实例首次创建时所经历的一系列初始化步骤。一旦函数实例创建完成,在其生命周期内不会再次经历冷启动。如果在代码中添加构造函数或静态初始化器,它们仅会在函数冷启动时被调用。可以在处理程序类的构造函数中添加显式日志,以便在函数日志中查看冷启动的发生情况。此外,还可以使用 X-Ray 和一些第三方 Lambda 监控工具来识别冷启动。 #### 2. 冷启动的影响 冷启动通常会导致事件处理出现延迟峰值,这也是人们关注冷启动的主要原因。一般情况下,小型 Lambda 函数的端到端延迟

Clojure多方法:定义、应用与使用场景

### Clojure 多方法:定义、应用与使用场景 #### 1. 定义多方法 在 Clojure 中,定义多方法可以使用 `defmulti` 函数,其基本语法如下: ```clojure (defmulti name dispatch-fn) ``` 其中,`name` 是新多方法的名称,Clojure 会将 `dispatch-fn` 应用于方法参数,以选择多方法的特定实现。 以 `my-print` 为例,它接受一个参数,即要打印的内容,我们希望根据该参数的类型选择特定的实现。因此,`dispatch-fn` 需要是一个接受一个参数并返回该参数类型的函数。Clojure 内置的

Hibernate:从基础使用到社区贡献的全面指南

# Hibernate:从基础使用到社区贡献的全面指南 ## 1. Hibernate拦截器基础 ### 1.1 拦截器代码示例 在Hibernate中,拦截器可以对对象的加载、保存等操作进行拦截和处理。以下是一个简单的拦截器代码示例: ```java Type[] types) { if ( entity instanceof Inquire) { obj.flushDirty(); return true; } return false; } public boolean onLoad(Object obj, Serial

响应式Spring开发:从错误处理到路由配置

### 响应式Spring开发:从错误处理到路由配置 #### 1. Reactor错误处理方法 在响应式编程中,错误处理是至关重要的。Project Reactor为其响应式类型(Mono<T> 和 Flux<T>)提供了六种错误处理方法,下面为你详细介绍: | 方法 | 描述 | 版本 | | --- | --- | --- | | onErrorReturn(..) | 声明一个默认值,当处理器中抛出异常时发出该值,不影响数据流,异常元素用默认值代替,后续元素正常处理。 | 1. 接收要返回的值作为参数<br>2. 接收要返回的值和应返回默认值的异常类型作为参数<br>3. 接收要返回

在线票务系统解析:功能、流程与架构

### 在线票务系统解析:功能、流程与架构 在当今数字化时代,在线票务系统为观众提供了便捷的购票途径。本文将详细解析一个在线票务系统的各项特性,包括系统假设、范围限制、交付计划、用户界面等方面的内容。 #### 系统假设与范围限制 - **系统假设** - **Cookie 接受情况**:互联网用户不强制接受 Cookie,但预计大多数用户会接受。 - **座位类型与价格**:每场演出的座位分为一种或多种类型,如高级预留座。座位类型划分与演出相关,而非个别场次。同一演出同一类型的座位价格相同,但不同场次的价格结构可能不同,例如日场可能比晚场便宜以吸引家庭观众。 -

JavaEE7中的MVC模式及其他重要模式解析

### Java EE 7中的MVC模式及其他重要模式解析 #### 1. MVC模式在Java EE中的实现 MVC(Model-View-Controller)模式是一种广泛应用于Web应用程序的设计模式,它将视图逻辑与业务逻辑分离,带来了灵活、可适应的Web应用,并且允许应用的不同部分几乎独立开发。 在Java EE中实现MVC模式,传统方式需要编写控制器逻辑、将URL映射到控制器类,还需编写大量的基础代码。但在Java EE的最新版本中,许多基础代码已被封装好,开发者只需专注于视图和模型,FacesServlet会处理控制器的实现。 ##### 1.1 FacesServlet的

并发编程:多语言实践与策略选择

### 并发编程:多语言实践与策略选择 #### 1. 文件大小计算的并发实现 在并发计算文件大小的场景中,我们可以采用数据流式方法。具体操作如下: - 创建两个 `DataFlowQueue` 实例,一个用于记录活跃的文件访问,另一个用于接收文件和子目录的大小。 - 创建一个 `DefaultPGroup` 来在线程池中运行任务。 ```plaintext graph LR A[创建 DataFlowQueue 实例] --> B[创建 DefaultPGroup] B --> C[执行 findSize 方法] C --> D[执行 findTotalFileS

设计与实现RESTfulAPI全解析

### 设计与实现 RESTful API 全解析 #### 1. RESTful API 设计基础 ##### 1.1 资源名称使用复数 资源名称应使用复数形式,因为它们代表数据集合。例如,“users” 代表用户集合,“posts” 代表帖子集合。通常情况下,复数名词表示服务中的一个集合,而 ID 则指向该集合中的一个实例。只有在整个应用程序中该数据类型只有一个实例时,使用单数名词才是合理的,但这种情况非常少见。 ##### 1.2 HTTP 方法 在超文本传输协议 1.1 中定义了八种 HTTP 方法,但在设计 RESTful API 时,通常只使用四种:GET、POST、PUT 和