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
版权声明:本文标题:JMX 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1727467739a1115930.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论