教你如何用JMX 检测应用程序.doc

上传人:M****1 文档编号:560354086 上传时间:2024-03-03 格式:DOC 页数:9 大小:331.01KB
返回 下载 相关 举报
教你如何用JMX 检测应用程序.doc_第1页
第1页 / 共9页
教你如何用JMX 检测应用程序.doc_第2页
第2页 / 共9页
教你如何用JMX 检测应用程序.doc_第3页
第3页 / 共9页
教你如何用JMX 检测应用程序.doc_第4页
第4页 / 共9页
教你如何用JMX 检测应用程序.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《教你如何用JMX 检测应用程序.doc》由会员分享,可在线阅读,更多相关《教你如何用JMX 检测应用程序.doc(9页珍藏版)》请在金锄头文库上搜索。

1、教你如何用JMX 检测应用程序 提示:本文档由91913网址导航()整理,供大家学习。如果你想用 JMX 检测应用程序,其实只需添加 bean 就可实现,立即可视结合平台内的 JMX 支持和 jconsole JMX 客户机可以提供一种向应用程序添加管理和监视功能的轻松方式。即使是没有具体管理需求的应用程序,为它们构建这些功能也会让您对程序的运行及其所处理的数据的性质获得深入了解,而且不需太多的工作和努力。如果应用程序导出管理接口,此接口让您可以查看它操作的内容,那么您就会更加了解它的运行状态对它是否按预期的方式工作也会更有信心而不必求助于额外的工具(例如添加日志代码或使用调试器或分析器)。调

2、试器和分析器可以提供对应用程序的行为的深入观察,但在出现严重问题之前,这些工具通常用不上。将监视挂钩(hook)构建到应用程序内,会使理解程序的执行变得更容易而且不会破坏调试器。既然 Java 管理扩展(JMX)已经构建进了 Java SE 平台,而且 jconsole 查看器提供了统一的监视 GUI,那么用 JMX 为应用程序提供一个窗口,要比以前更加容易而且更为有效。有多少次您曾经注视着运行中的应用程序,问自己:“它到底在做什么?为什么用了这么长时间呢?” 在这些时刻,您可能会想如果自己在应用程序中构建了更多的监视功能就好了。例如,在服务器应用程序中,能够查看排队等候处理的任务的数量和类型

3、、当前正在处理的任务、过去一分钟或一小时内的吞吐量统计、平均任务处理时间等。这些统计值容易搜集,但是在需要数据的时候,如果没有非侵入性的数据检索机制,那么这些值就不太有用。 可以用许多方式导出操作性数据可以把周期性统计快照写入日志文件、创建 Swing GUI、使用内嵌的 HTTP 服务器在 Web 页面上显示统计值或者发布可以用来查询应用程序的 Web 服务。但是在缺少监视和数据发布基础设施的情况下,多数应用程序开发人员都做不到这些,因此造成对应用程序工作情况的了解要比预期的少很多。 JMX:在 Java 5.0 中,类库和和 JVM 提供了一种全面的管理和监视基础设施JMX。JMX 是一种

4、用来提供可以远程访问的管理接口的标准措施,也是一种向应用程序添加灵活且强大的管理接口的简易方式。被称作受管 bean(MBean)的 JMX 组件,是提供与实体的管理有关的访问器和业务方法的 JavaBean。每个受管的实体(可能是整个应用程序或应用程序中的服务)实例化一个 MBean 并用可读懂的名称注册它。支持 JMX 的应用程序依赖于 MBeanServer,它充当 MBean 的容器,提供远程访问、命名空间管理和安全服务。在客户端,jconsole 工具可以充当统一的 JMX 客户机。结合两者,对 JMX 的平台支持极大地降低了使应用程序支持外部管理接口所需的工作和努力。 除了提供 M

5、BeanServer 实现,Java SE 5.0 还提供 JVM 以更方便地了解内存管理、类装入、活动线程、日志和平台配置的状态。多数平台服务的监视和管理在默认情况下都是开启的(性能影响最小),所以只需要连接应用程序与 JMX 客户机即可。图 1 给出了 jconsole JMX 客户机(JDK 的一部分) ,它显示了其中一个内存管理视图一段时间内的堆使用情况。Perform GC 按钮则证明了 JMX 可以提供 除了查看操作统计值之外的初始化操作的功能。 传输和安全性JMX 指定了在 MBeanServer 和 JMX 客户之间通信所使用的协议,协议可以在各种传输机制上运行。可以使用针对本

6、地连接的内置传输,及通过 RMI、socket 或 SSL 的远程传输(可以通过 JMX Connector API 创建新的传输)。认证是由传输执行的;本地传输允许用相同的用户 ID 连接到运行在本地系统上的 JVM;远程传输可以用口令或证书进行认证。本地传输在 Java 6 下默认就是启用的。要在 Java 5.0 下启用它,需要在 JVM 启动时定义系统属性 com.sun.management.jmxremote。“Monitoring and Management using JMX” 这份文档(请参阅参考资料)描述了启用和配置传输的配置步骤。 检测 Web 服务器检测应用程序来使用

7、 JMX 很容易。像其他许多远程调用框架(RMI、EJB 和 JAX-RPC)一样,JMX 也是基于接口的。要创建管理服务,需要创建指定管理方法的 MBean 接口。然后可以创建一个 MBean 来实现此接口、实例化它及把它注册到 MBeanServer。 清单 1 显示了网络服务(例如 Web 服务器)的 MBean 接口。它提供了检索配置信息(例如端口号)和操作性信息(例如服务是否启动)的 getter。它还包含查看和修改可配置参数(例如当前日志级别)的 getter 和 setter,还有调用管理操作(例如 start() 和 stop())的方法。 清单 1. 某个 Web 服务器的

8、MBean 接口public interface WebServerMBean public int getPort(); public String getLogLevel(); public void setLogLevel(String level); public boolean isStarted(); public void stop(); public void start();实现 MBean 类通常非常直接明了,因为 MBean 接口要反映现有实体或服务的属性和管理操作。例如,MBean 中的 getLogLevel() 和 setLogLevel() 方法会直接转给被 We

9、b 服务器使用的 Logger 上的 getLevel() 和 setLevel() 方法。JMX 做了一些命名限制。例如,MBean 接口名称必须以 MBean 结尾,FooMBean 接口的 MBean 类必须叫作 Foo。(可以用更高级的 JMX 特性动态 MBean 来去除这个限制。)把 MBean 注册到默认的 MBeanServer 也很容易,如清单 2 所示: 清单 2. 用内置的 JMX 实现注册 MBean public class WebServer implements WebServerMBean . . WebServer ws = new WebServer(.);

10、 MBeanServer server = ManagementFactory.getPlatformMBeanServer(); server.registerMBean(ws, new ObjectName(myapp:type=webserver,name=Port 8080);传递给 registerMBean() 的 ObjectName 标识了受管实体。因为预见到指定应用程序可能包含许多受管实体,所以名称包含域(清单 2 中的 “myapp”)和许多标识域中的受管资源的键-值对。“name” 和 “type” 这两个键是常用的,在使用的时候,name 应当在域中所有的同类 MBea

11、n 中能够唯一地标识受管实体。也可以指定其他键-值对,而且 JMX API 还包含进行对象名称通配匹配的工具。 创建并注册了 MBean 之后,立即就可以把 jconsole 指向应用程序(在命令行输入 jconsole)并在 “MBeans” 视图中查看它的管理属性和操作。图 2 显示了 jconsole 中针对新 MBean 的 Attributes 标签,图 3 显示了 Operations 标签。使用反射,JMX 可以指出哪个属性是只读的(Started、Port),哪个属性是可读写的(LogLevel),而且 jconsole 允许修改读写属性。如果读写属性的 setter 抛出异常

12、(例如 IllegalArgumentException),JMX 就把异常报告给客户机。 图 2. jconsole 中 MBean 的 Attributes 标签图 3. jconsole 中 MBean 的 Operations 标签数据类型MBean 中的访问器和操作能够用任何其签名形式的原语类型,以及 String、Date 和其他标准库类。也可以使用这些允许的类型的数组和集合。MBean 方法也可以使用其他可以序列化的数据类型,但是这样做会造成互操作性问题,因为类文件也必须对 JMX 客户机可用。(如果使用 RMI 传输,可以使用 RMI 的自动类下载特性完成这项任务。)如果想在管

13、理接口中使用结构化数据类型,还想避免与类可用性相关的互操作性问题,可以使用 JMX 的开放 MBean 特性来表达复合或表格数据。 检测服务器应用程序在创建管理接口时,某些参数和操作的特点很自然地就表明这些参数和数据应当被包含在内,例如配置参数、操作统计值、调试操作(例如修改日志级别或把应用程序状态导出到文件)、生命周期操作(启动、停止)。检测一个应用程序,让它支持对这些属性和操作的访问,通常相当容易。但是,要从 JMX 获得最大价值,就要在设计时考虑什么数据在运行时对用户和操作员有用。 如果用 JMX 了解服务器应用程序的工作情况,需要一种标识和跟踪工作单元的机制。如果使用标准的 Runna

14、ble 和 Callable 接口描述任务,通过让任务类自描述(例如实现toString() 方法),可以在任务生命周期内跟踪它们,并提供 MBean 方法来返回等候中、处理中和完成的任务列表。 清单 3 中的 TrackingThreadPool 演示的是 ThreadPoolExecutor 的一个子类,它及时给出正在处理中的是哪些任务,以及已经完成的任务的时间统计值。它通过覆盖 beforeExecute() 和 afterExecute() 挂钩,并提供能检索所搜集数据的 getter,实现这些任务。 清单 3. 搜集处理中的任务和平均的任务时间统计值的线程池类public class

15、 TrackingThreadPool extends ThreadPoolExecutor private final Map inProgress = new ConcurrentHashMap(); private final ThreadLocal startTime = new ThreadLocal(); private long totalTime; private int totalTasks; public TrackingThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); protected void beforeExecute(Thread t, Runnable r) super.beforeEx

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号