`

JMX 简介

    博客分类:
  • j2ee
阅读更多

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);
	}
}

 

  • 大小: 34 KB
  • 大小: 33.4 KB
  • 大小: 29.5 KB
  • 大小: 29 KB
  • 大小: 31.8 KB
  • 大小: 33.3 KB
分享到:
评论
1 楼 lijiejava 2013-07-10  
好!!!  

相关推荐

    JMX简介

    NULL 博文链接:https://hotboy10001000.iteye.com/blog/865118

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    20.1 jmx简介 156 20.2 jmx api 157 20.2.1 MBeanServer 157 20.2.2 ObjectName 157 20.3 Standard MBeans 158 20.4 Model MBeans 159 20.4.1 MBeanInfo与ModelMBeanInfo 160 20.4.2 ModelMBean实例 161 20.5 ...

    how-tomcat-works

    20.1 jmx简介 156 20.2 jmx api 157 20.2.1 MBeanServer 157 20.2.2 ObjectName 157 20.3 Standard MBeans 158 20.4 Model MBeans 159 20.4.1 MBeanInfo与ModelMBeanInfo 160 20.4.2 ModelMBean实例 161 20.5 ...

    (超赞)JAVA精华之--深入JAVA API

    2.1.6 JMX的当前实现及应用 2.1.7 小结 2.2 应用 JMX 最佳实践 2.3 Java/J2EE中文问题终极解决之道 2.4 Java Web应用中的任务调度 2.5 用连接池提高Servlet访问数据库的效率 2.6 应用服务器的集群策略及Java EE 5.0 ...

    JAVA SE学习精华集锦

    2.1.6 JMX的当前实现及应用 91 2.1.7 小结 91 2.2 应用 JMX 最佳实践 91 2.3 Java/J2EE中文问题终极解决之道 95 2.4 Java Web应用中的任务调度 96 2.5 用连接池提高Servlet访问数据库的效率 99 2.6 应用服务器的集群...

    Java管理扩展指南之MBean简介

    本课程介绍JMXAPI的基本概念,它被称之为被管理的bean,或者MBean。MBean是一个被管理的Java对象,就像Javabean组件一样,但是它遵从JMX规范的设计模式。MBean可以表示设备、应用或者任何需要被管理的资源。MBeans...

    吴天雄--Spring笔记.doc

    第一天内容:Spring框架简介(EJB、JMX、Spring核心功能、Spring模块详解、Spring重要概念(容器)、Spring容器初始化的整个流程、Spring后处理器),IOC详解,Spring环境搭建,Spring创建Bean的三种方式,scope属性...

    Java SE实践教程 源代码 下载

    内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,市面上这样的书实在太少了,所以在这里发布下,供大家共享。本书从编程技术、项目实践以及软件工程的角度出发,如果...

    Hbase+Spring boot实战分布式文件存储

    实战开发通过jmx获取HBase运行时数据,监控集群状态 5-1 HBase备份与恢复 5-2 HBase监控简介 5-3 Hadoop JMX监控实战 5-4 HBase JMX监控实战 第6章 Phoenix & Sqoop 对HBase业务应用过程中常用到的第三方开源工具...

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    资源简介 Jakarta commons docs API CHM 格式带索引和全文搜索,方便携带和查询。 Jakarta commons 包含很多可复用的通用组件。 commons-attributes 让开发者可以使用 C# 或 .net 样式的 attributes, 是一种运行时...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,市面上这样的书实在太少了,所以在这里发布下,供大家共享。本书从编程技术、项目实践以及软件工程的角度出发,如果...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,市面上这样的书实在太少了,所以在这里发布下,供大家共享。本书从编程技术、项目实践以及软件工程的角度出发,如果...

    Spring 2.0 开发参考手册

    1. 简介 1.1. 概览 1.2. 使用场景 2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加...

    spring chm文档

    2.6.2. JMX 2.6.3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本...

    Spring API

    2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.6.2. JMX 2.6 .3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.7.1.1. Jar包 2.7.1.2. XML配置 2.7.1.3. Deprecated的类和方法 2.7.1.4. Apache OJB 2.7.1.5. iBatis 2.8....

    Spring中文帮助文档

    2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 ...

    BEA WebLogic Server管理指南

    在Windows、Linux和AIX上成功安装和配置WebLogic Application Server在一个或多个服务器与群集上部署和配置应用程序管理JMX对象,如MBean与MBeanServer 理解J2EE服务,包括EFB、JNDI、JDBC、JMS等 使用管理控制台来...

Global site tag (gtag.js) - Google Analytics