JMX【Java Management Extensions】 java管理扩展。简而言之,它提供一个统一的接口来管理一些系统资源。例如,你可能需要在某一时刻手动的删除服务器内存中的数据。那可行的解决方案就是提供一个页面,然后用户可在这个页面是做各种操作,然后发各种请求给服务器,然后服务器相应用户请求,做相应操作。而利用jmx就不需要自己去创建页面,只需将所要提供的服务注册到jmx,利用原生的jconsole就能控制系统资源。
一 注册MBean并通过JConsole查看MBean
1.HelloMBean.java
package mbean; public interface HelloMBean { public void sayHello(); public void setName(String name); public String getName(); }
2.Hello.java
package mbean; public class Hello implements HelloMBean { private String name; @Override public void sayHello() { System.out.println("say hello..."); } @Override public void setName(String name) { this.name=name; } @Override public String getName() { return name; } }
3.Main.java[注册MBean]
package mbean; import java.lang.management.ManagementFactory; import javax.management.MBeanServer; import javax.management.ObjectName; public class Main { public static void main(String[] args) throws Exception{ System.out.println(System.getProperties()); MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("com.example:type=Hello"); Hello mbean = new Hello(); mbs.registerMBean(mbean, name); System.out.println("Waiting forever..."); Thread.sleep(Long.MAX_VALUE); } }
编写MBean接口时,命名必须以MBean结尾,并且相应的实现类【这里是Hello.java】必须和接口【这里是HelloMBean.java】在同一包下。
4. 通过JConsole查看注册的MBean。
二 注册MXBean并通过JConsole查看
1.QueueSample.java
package mxbean; import java.util.Date; public class QueueSample { private final Date date; private final int size; private final String head; public QueueSample(Date date, int size, String head) { this.date = date; this.size = size; this.head = head; } public Date getDate() { return date; } public int getSize() { return size; } public String getHead() { return head; } }
2.QueueSamplerMXBean.java
package mxbean; public interface QueueSamplerMXBean { public QueueSample getQueueSample(); public void clearQueue(); }
3.QueueSampler.java
package mxbean.impl; import java.util.Date; import java.util.Queue; import mxbean.QueueSample; import mxbean.QueueSamplerMXBean; public class QueueSampler implements QueueSamplerMXBean { private Queue<String> queue; public QueueSampler(Queue<String> queue) { this.queue = queue; } public QueueSample getQueueSample() { synchronized (queue) { return new QueueSample(new Date(), queue.size(), queue.peek()); } } public void clearQueue() { synchronized (queue) { queue.clear(); } } }
编写MXBean接口时,没有像MBean那么多约束。接口命名可以以MXBean结尾也可以不用,只需要在接口上添加@MXBean注解来表明这个是一个MXBean。而且实现了可以与接口在不同包。最重要的是MXBean可以定义复杂的数据类型。
4 .Main.java[注册MXBean]
package mxbean; import java.lang.management.ManagementFactory; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import javax.management.MBeanServer; import javax.management.ObjectName; import mxbean.impl.QueueSampler; public class Main { public static void main(String[] args) throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName mxbeanName = new ObjectName("com.example:type=QueueSampler"); Queue<String> queue = new ArrayBlockingQueue<String>(10); queue.add("Request-1"); queue.add("Request-2"); queue.add("Request-3"); QueueSampler mxbean = new QueueSampler(queue); mbs.registerMBean(mxbean, mxbeanName); System.out.println("Waiting..."); Thread.sleep(Long.MAX_VALUE); } }
5. 通过JConsole查看
三 使用JMX Notification
1.AnimalMBean.java
package notification; public interface AnimalMBean { public void eat(); public void sleep(); }
2.Animal.java
package notification; import javax.management.AttributeChangeNotification; import javax.management.MBeanNotificationInfo; import javax.management.Notification; import javax.management.NotificationBroadcasterSupport; public class Animal extends NotificationBroadcasterSupport implements AnimalMBean{ int sequenceNumber=1; private String status="eat"; @Override public void eat() { System.out.println("animal eats ..."); Notification n = new AttributeChangeNotification(this, sequenceNumber++, System.currentTimeMillis(), "aniaml eats", "status", "String", status, "eat"); sendNotification(n); status="eat"; } @Override public void sleep() { System.out.println("animal sleeps..."); Notification n = new AttributeChangeNotification(this, sequenceNumber++, System.currentTimeMillis(), "aniaml sleeps", "status", "String", status, "sleep"); sendNotification(n); status="sleep"; } @Override public MBeanNotificationInfo[] getNotificationInfo() { String[] types = new String[]{ AttributeChangeNotification.ATTRIBUTE_CHANGE }; String name = AttributeChangeNotification.class.getName(); String description = "An attribute of this MBean has changed"; MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description); return new MBeanNotificationInfo[]{info}; } }
3.Main.java
package notification; import java.lang.management.ManagementFactory; import javax.management.MBeanServer; import javax.management.ObjectName; public class Main { public static void main(String[] args) throws Exception{ MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName mxbeanName = new ObjectName("com.example:type=Notification"); Animal mxbean = new Animal(); mbs.registerMBean(mxbean, mxbeanName); System.out.println("Waiting..."); Thread.sleep(Long.MAX_VALUE); } }
每当Animal类中eat或sleep方法是,都会向订阅者发送消息。
4. JConsole 演示
点击Subscribe订阅
点击sleep或eat任意按钮,触发相应操作
在Notifications中会接收相应的消息
四 远程调用jmx。之前以上例子都是运行在本地的。只有本地的JConsole才能访问。
而要注册一个可供远程调用的MBean,必须暴露一个端口可供外部访问。
例如要将例1HelloMBean.java暴露出去
必须在启动参数中加入如下参数
-Dcom.sun.management.jmxremote.port=9999 // 外部访问端口
-Dcom.sun.management.jmxremote.authenticate=false // 关闭验证
-Dcom.sun.management.jmxremote.ssl=false // 关闭ssl
1. 通过JConsole访问
输入远程jmx服务器的ip地址以及jmx暴露的端口号
2. 通过代码远程调用
Main.java
package remote.access; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public class Main { public static void main(String[] args) throws Exception{ JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.7:9999/jmxrmi"); JMXConnector jmxc = JMXConnectorFactory.connect(url); MBeanServerConnection mbsc=jmxc.getMBeanServerConnection(); ObjectName name = new ObjectName("com.example:type=Hello"); mbsc.invoke(name, "sayHello",null,null); } }
相关推荐
NULL 博文链接:https://hotboy10001000.iteye.com/blog/865118
1. **JMX简介** JMX的主要作用是让开发者能够创建和注册可管理的对象,即MBeans,它们代表了应用程序中的各种资源或服务。MBeans提供了暴露其状态和操作的方法,使得管理者可以通过JMX API进行访问和控制。例如,...
#### 一、JMX简介 JMX,全称为Java Management Extensions,是一项由Sun Microsystems提出并被广泛采纳的标准技术。它主要用于监控和管理系统资源,包括但不限于应用程序、硬件设备以及网络资源等。通过使用JMX,...
### JMX 简介 JMX 不仅仅是一个接口,而是一套完整的规范,允许开发者将管理功能集成到Java应用中。通过MBeans,开发者可以创建可管理的对象,这些对象可以代表应用程序中的任何资源或服务,如配置参数、服务状态等...
1. **JMX简介**:JMX是Java平台的一部分,提供了一种标准的方式来管理和监控Java应用程序。它允许开发者创建可管理和可监控的组件,并将它们集成到应用程序中。 2. **MBean(Managed Beans)**:MBean是JMX的核心...
#### JMX简介及其发展历程 JMX(Java Management Extensions)是一种用于管理与监控应用程序的标准框架和技术。它的前身是JMAPI(Java Management API),随着技术的发展,逐渐演变成了今天我们所熟知的JMX。JMX的...
1. **JMX简介** JMX允许开发者创建和注册管理 Bean(MBeans),这些Bean提供了对应用程序组件的访问接口,从而可以监控和管理其状态。MBeans分为标准MBean、自定义MBean和动态MBean三种类型,它们分别对应不同的...
#### 一、JMX 简介 Java Management Extensions (JMX) 是一个为应用程序、设备、系统等提供标准管理界面的框架。它允许开发者监控和管理资源(如应用程序、设备和服务),通过标准接口暴露资源的属性、操作和事件。...
一、JMX简介 Java Management Extensions (JMX) 是Java平台的一个标准组件,它提供了管理和监控应用程序、操作系统、硬件设备和网络服务的能力。通过JMX,开发者可以定义管理对象(MBeans),这些对象封装了应用程序...
JMX简介 JMX是Java平台上的一个标准,允许开发者创建可管理的组件,并通过统一的接口进行监控和控制。它使得系统管理员能够轻松地获取运行时信息,调整参数,甚至在必要时执行远程操作。JMX通过MBeans(Managed ...
#### 二、JMX简介及其发展历程 **JMX**(Java Management Extensions) 是一种用于管理与监视应用程序的标准技术。它的前身是 **JMAPI**(Java Management API),后来演变为JMX并逐渐成为业界广泛接受的标准之一。 - *...
### JMX简介 JMX是一种服务,它提供了一种灵活的方式来管理和监控Java应用程序,包括内存使用、线程状态、MBeans(Managed Beans)等。MBeans是JMX的核心概念,它们是Java对象,代表可管理的资源或服务,并提供了...
一、JMX简介 JMX是Java平台上的一个标准API,它定义了如何在Java应用程序中创建、部署和管理组件的规范。这些组件可以是应用程序中的任何对象,如服务器、设备、服务等。通过JMX,开发者可以创建管理beans(MBeans)...
#### 一、Zabbix与JMX监控简介 **Zabbix**是一款开源的企业级监控工具,它能够监控网络中的各种硬件资源和软件服务的状态,并且提供了丰富的功能,如自动发现、报警等。在Zabbix 2.0版本中引入了一个新的特性——...
- **JMX 简介**:这部分介绍了 JMX(Java Management Extensions)的概念,包括它的层次结构和组件。 - **Instrumentation Level**:指定了监控和管理资源的基本方法。 - **Agent Level**:涉及通过代理来管理资源...
- **JMX简介**:解释了Java Management Extensions (JMX) 的基本概念及其在JBoss中的作用。 - **仪表化级别**:探讨了在不同层级上如何实现监控和管理。 - **代理级别**:介绍了如何利用代理来扩展管理功能。 - ...
2. **JMX简介**:JMX是一种Java技术,用于管理与监控应用中的资源。它提供了一种标准化的方式来访问系统和应用程序的信息,并允许进行远程管理和监控。对于WebLogic而言,JMX可以通过MBeans(Managed Beans)来访问...