admin管理员组

文章数量:1562473

JMX

介绍:

JMX 全称JAVA Management Extensions , 技术提供构建分布式,web,模块化的工具,以及管理和监控设备和应用的动态解决方案。从Java5 开始,JMX API 作为Java平台的一部分

 

规范:

JSR 3: JMX1.0, JMX1.1 和 1.2 (作为Java 5 的一部分)

JMX 1.4 : 2006.11.09 (作为Java 6的一部分)

JSR 255 : JMX 2.0

JSR 160 : JMX Remote API 1.0

JSR 262 : JMX Remote API for Web Services

 

 

优势:

激活应用管理无需大量投资

提供伸缩性管理架构

整合现有的管理解决方案

对现在的Java技术起到杠杆作用

能够扛起未来管理概念

定义面向接口管理

 

 

架构概况:

设备级别

代理级别

分布式服务级别

可添加管理协议API

 

 

管理Bean(MBeans)

a 标准MBeans

设计和实现最为简单,Bean的管理通过接口方法来描述。MXBean是一种特殊标准Mbean, 它使用开放MBean的概念,允许通用管理,同时简化编码

b 动态MBeans

必须实现指定的接口,不过它在运行时能让管理接口发挥最大弹性

c开放MBeans

提供通用管理所依赖的基本数据类型以及用户友好的自描述信息

d 模型MBeans

在运行时能够完全可配置和自描述,为动态的设备提供带有默认行为的MBean泛型类

 

 

 

标准 MBeans

MBean 接口的类名必须以 MBean 为后缀,如MBean 定义为 “XXXMBean”, 那么它的实现类名必须是 “XXX”

MXBean 接口的类名称必须以 "MXBean"为后缀,或者接口标记@javax.management.MXBea注解

 

 

动态MBeans

管理资源实现 javax.management.DynamicMBean 接口

 

动态Bean

 

JMX Spring 整合

核心组件

管理资源

组件 : MangedResource

注解: @MangedResource

 

String JMX 组件:MBeanExportor

Spring Boot 自动装配 : JMXAutoConfiguration

 

 

如果是单体应用,我们可以用JMX 把需要配置的属性集中到一个类中,然后写一个MBean, 在进行相关配置。我们可以用一些JMX 客户端工具对属性进行修改

通过JMX,可以轻松获取JVM的各项数据值,例如GC执行次数,当前JVM使用的GC类型,内存占用,GC暂停的时间等,在此之上,tomcat 对外暴露了许多有用的数据,可以通过JMX获取具体通道外的连接数据,请求数,响应数,失败的请求有多少,线程池的数据,JNDI的数据等扥

 

 

 

简单Bean 展示

定义被监控Bean的接口

package cn.shendu.springbootlesson17.mbean;

 

public interface SimpleDataMBean {

 

void setData(String data);

String getData();

 

void displayData();

 

}

定义 被监控的Bean

 

import javax.management.*;

import java.util.concurrent.atomic.AtomicLong;

 

import static javax.management.AttributeChangeNotification.ATTRIBUTE_CHANGE;

 

public class SimpleData extends NotificationBroadcasterSupport implements SimpleDataMBean,

NotificationListener,NotificationFilter{

 

 

public SimpleData(){

this.addNotificationListener(this,this,null);

}

 

private String data;

private final AtomicLong sequenceNumber = new AtomicLong();

@Override

public void setData(String data) {

this.data = data;

 

String oldData = this.data;

 

Notification notification = new AttributeChangeNotification(this,sequenceNumber.incrementAndGet()

,System.currentTimeMillis(),"Data has been changed from "+ oldData+"to"+data

,"data",String.class.getName(),oldData,data);

 

sendNotification(notification);

}

 

public MBeanNotificationInfo[] getNotificationInfo() {

return new MBeanNotificationInfo[]{

new MBeanNotificationInfo(new String[]{ATTRIBUTE_CHANGE},

"Data change Notification","数据改变通知")};

}

 

@Override

public String getData() {

return data;

}

 

@Override

public void displayData() {

System.out.println(this.data);

}

 

 

 

//过滤器

@Override

public synchronized boolean isNotificationEnabled(Notification notification) {

// 只关心 AttributeChangeNotification 通知,并且限于 属性字段名称 为"data"

if(AttributeChangeNotification.class.isAssignableFrom(notification.getClass())){

AttributeChangeNotification attributeChangeNotification =

AttributeChangeNotification.class.cast(notification);

if("data".equals(attributeChangeNotification.getAttributeName())){

return true;

}

 

}

 

return false;

}

 

// 处理通知

@Override

public void handleNotification(Notification notification, Object handback) {

AttributeChangeNotification attributeChangeNotification = (AttributeChangeNotification) notification;

 

String oldValue = (String) attributeChangeNotification.getOldValue();

 

System.out.println("oldValue:........."+oldValue);

 

String newValue = (String) attributeChangeNotification.getNewValue();

 

System.out.println("newValue:.........."+newValue);

}

}

 

 

编写执行类

 

 

import javax.management.MBeanServer;

import javax.management.MalformedObjectNameException;

import javax.management.ObjectName;

import java.lang.management.ManagementFactory;

 

public class MBeanDemo {

 

public static void main(String[] args) throws Exception {

 

// MBean 服务器 -Agent Level

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

 

//注册MBean

SimpleData simpleData = new SimpleData();

ObjectName objectName = createObjectName(simpleData);

mBeanServer.registerMBean(simpleData,objectName);

 

System.in.read();

}

 

 

private static ObjectName createObjectName(Object mBean) throws MalformedObjectNameException {

Class<?> mBeanClass = mBean.getClass();

String packageName = mBeanClass.getPackage().getName();

String className = mBeanClass.getSimpleName();

 

return new ObjectName(packageName+":type="+className);

 

}

 

}

 

NotificationBroadcasterSupport 在构造器 添加 自定义Notification

NotificationListener 继承它,自身作为一个Notification

NotificationFilter 继承它,自身作为一个 Notification过滤器

 

结果演示

 

 

 

 

编写一个动态MBean

动态MBean 必须要实现 DynamicMBean

自定义动态MBean 编写

 

 

import javax.management.*;

 

import static javax.management.MBeanOperationInfo.ACTION;

 

public class SimpleDynamicMBean implements DynamicMBean{

private String value;

 

@Override

public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {

return value;

}

 

@Override

public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {

String attributeName = attribute.getName();

if("value".equals(attributeName)){

this.value = (String) attribute.getValue();

}

}

 

@Override

public AttributeList getAttributes(String[] attributes) {

return null;

}

 

@Override

public AttributeList setAttributes(AttributeList attributes) {

return null;

}

 

@Override

public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException {

if("displayValue".equals(actionName)){

return value;

}

return null;

}

 

public void displayValue(){

System.out.println("...................");

}

 

@Override

public MBeanInfo getMBeanInfo() {

MBeanInfo mBeanInfo = new MBeanInfo(

this.getClass().getName(),

"简单自定义DynamicMBean",

of(new MBeanAttributeInfo("value",String.class.getName(),"动态属性value",true,true,false)),

of(new MBeanConstructorInfo(this.getClass().getSimpleName(),"默认构造器",new MBeanParameterInfo[0])),

of(new MBeanOperationInfo("displayValue","自定义displayValue方法",new MBeanParameterInfo[0],String.class.getName(),ACTION)),

new MBeanNotificationInfo[0]

);

return mBeanInfo;

}

 

private static <T> T[] of(T ... array){

return array;

}

}

 

 

调用类

 

 

import cn.shendu.springbootlesson17.mbean.SimpleData;

 

import javax.management.MBeanServer;

import javax.management.MalformedObjectNameException;

import javax.management.ObjectName;

import java.lang.management.ManagementFactory;

 

public class dynamicDemo {

 

public static void main(String[] args) throws Exception {

 

// MBean 服务器 -Agent Level

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

 

//注册MBean

SimpleDynamicMBean simpleDynamicMBean = new SimpleDynamicMBean();

 

 

ObjectName objectName = createObjectName(simpleDynamicMBean);

mBeanServer.registerMBean(simpleDynamicMBean,objectName);

 

System.in.read();

}

 

 

private static ObjectName createObjectName(Object mBean) throws MalformedObjectNameException {

Class<?> mBeanClass = mBean.getClass();

String packageName = mBeanClass.getPackage().getName();

String className = mBeanClass.getSimpleName();

 

return new ObjectName(packageName+":type="+className);

 

}

}

 

运行 结果

 

 

 

 

参考 小马哥 springboot 视频

本文标签: jmx