JMX 简介

标签: j2ee  jmx

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

 

版权声明:本文为iteye_5753原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_5753/article/details/82519601

智能推荐

JMX 入门例子

       JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。     我们还是从JMX能给我们提供什么好处入手来理解吧。举一个应用实例:在一个...

jmx的简单学习

背景 前段时间在看btrace源码和jdk一些源码的时候,经常会看到一些jmx的相关内容。以前对jmx基本是一片空白区,花了点时间学习记录下。   过程 jmx总体架构图:  说明:  1.  Agent : javax.management.MBeanServer实现了Agent的功能,以标准的方式给出了管理系统访问 JMX 框架的接口 2.&n...

zabbix JMX 监控tomcat

使用zabbix JMX 监控tomcat 开启服务 修改配置文件 在网页中 在server3主机...

JMX(三)Notification

MBean之间的通信是必不可少的,Notification就起到了在MBean之间沟通桥梁的作用,JMX Notification由4个部分组成: Notification 这个相当于一个信息包,封装了需要传递的信息。 Notification broadcast 这相当于一个广播器,把消息广播出去。 Notification listerner 这是一个监听器,用于监听广播出...

JMX(二)HelloWorld

1.文件目录  2.需要jdmkrt.jar附件可下载   3.创建 HelloMBean       4.创建Hello实现HelloMBean接口,     5.创建HelloAgent      6.运行HelloAgent ,然后打开网页http://localhost:8082 如图所示 ...

猜你喜欢

linux上安装Qt4.8.6+QtCreator4.0.3

一、Qt简介 Qt是1991年奇趣科技开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。Qt很容易扩展,并且允许真正地组件编程。 准备工作 操作系统:centos6.5 位数:64位 二、安装 1、获取源码Qt4.8.6 2、获取源码QtCreator4.0.3 2、安装QtCreator4.0.3 进入QtCreator安装界面,指定...

react-native metro 分析

文章目录 前言 概念 Resolution Transformation Serialization 打包方式 Moudles Plain bundle Indexed RAM bundle File RAM bundle 流程 前置流程 resolve流程 Transformer流程 序列化流程 缓存 为什么要缓存 缓存的请求与缓存 Metro配置 结构 前言 metro是一种支持ReactNa...

嵌入式Linux——应用调试:用户态打印段错误信息

简介:     很多时候我们会遇到段错误:segmentation fault,而段错误有时是由内核引起的,有时是由应用程序引起的。在内核态时,发生段错误时会打印oops信息,但是在用户态时,发生段错误却只会打印segmentation fault而并不会打印其他的信息。所以本文主要介绍在用户态时,通过修改内核设置和添加启动参数来打印引发segmentati...

springboot1.4.1整合logback 遇到的问题

springboot1.4.1整合logback 遇到的问题 项目使用了springboot1.4.1整合logback,然而设置的过期时间15 并没有生效, 2GB达到2G自动删除也没有生效,仅仅实现了按大小分割。 经过查看pom 父工程内的源码发现是默认的logback版本是1.1.7,而过期时间配置是在logback 1.1.8以后才支持的。 不得不说这是springboot1.4.1 的b...

记一次C/S架构的渗透测试

概述 目标站点是http://www.example.com,官网提供了api使用文档,但是对其测试后没有发现漏洞,目录、端口扫描等都未发现可利用的点。后发现官网提供了客户端下载,遂对其进行一番测试。 信息收集 先抓了下客户端的包,使用Fiddler和BurpSuite都抓不到,怀疑走的不是HTTP协议,用WireShark查看其确实用的是HTTP协议,但是数据包不好重放,这里最后使用了WSExp...