jmx中标准MBean使用

createh53周前 (12-11)技术教程20

一、简介

jmx(java management extentions),即java管理扩展,用于对应用程序进行监控和管理。jmx是一个标准、接口或者框架,可以在应用程序运行期,对自定义类发起调用。这里对标准MBean进行介绍。

二、标准Mbean开发步骤

标准Mbean开发步骤如下:

自定义以MBean结尾的接口,如:StaticConfigManagerMBean;

实现步骤1定义的接口,特别注意接口实现类名必须是接口去掉结尾MBean,如:StaticConfigManager;

对MBean实现类进行注册,如:

//mbean注册

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

ObjectName name = new ObjectName("staticConfigManagerMBean:name=staticConfigManager");

mBeanServer.registerMBean(new StaticConfigManager(), name);

在应用程序开启监听端口,方式有两种,程序中开启和启动类添加参数开启。

方式一,程序中开启,如:

//开启jmx监听端口10014

LocateRegistry.createRegistry(10014);

//指定监控对象及名称

JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:10014/jmxrmi");

JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, mBeanServer);

//开启监控

jmxConnectorServer.start();

方式二,启动类添加参数开启,如:

-Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.port=10014 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

启动java工具jconsole,并远程连接,连接地址如:

localhost:10014

在jconsole连接成功后,在界面MBean中,调用自定义的MBean接口实现。

三、示例

这里以操作静态类StaticConfig的MBean管理为例。

3.1 示例项目

定义表态类

package com.dragon.study.spring_boot_main;

public class StaticConfig {

//自定义静态属性

public static String configName="apple";

//自定义静态方法

public static String sayHello(){

return "hello " + configName;

}

}

定义MBean MBean接口如下:

package com.dragon.study.spring_boot_main.mbean;

public interface StaticConfigManagerMBean {

String printConfigName();

void changeConfigName(String configName);

}

MBean接口实现类如下:

package com.dragon.study.spring_boot_main.mbean;

import com.dragon.study.spring_boot_main.StaticConfig;

public class StaticConfigManager implements StaticConfigManagerMBean {

@Override

public String printConfigName() {

System.out.println("StaticConfigManager, configName:" + StaticConfig.configName);

return StaticConfig.configName;

}

@Override

public void changeConfigName(String configName) {

StaticConfig.configName = configName;

}

}

启动类里注册MBean及开启监控端口

package com.dragon.study.spring_boot_main;

import com.dragon.study.spring_boot_main.mbean.StaticConfigManager;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.management.MBeanServer;

import javax.management.ObjectName;

import javax.management.remote.JMXConnectorServer;

import javax.management.remote.JMXConnectorServerFactory;

import javax.management.remote.JMXServiceURL;

import java.lang.management.ManagementFactory;

import java.rmi.registry.LocateRegistry;

@SpringBootApplication

public class SpringBootMainApplication {

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

SpringApplication.run(SpringBootMainApplication.class, args);

//主动加载静态类

Class.forName("com.dragon.study.spring_boot_main.StaticConfig");

//mbean注册

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

ObjectName name = new ObjectName("staticConfigManagerMBean:name=staticConfigManager");

mBeanServer.registerMBean(new StaticConfigManager(), name);

//开启jmx监听端口10014

LocateRegistry.createRegistry(10014);

//指定监控对象及名称

JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:10014/jmxrmi");

JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, mBeanServer);

//开启监控

jmxConnectorServer.start();

}

}

3.2 测试

测试如下:

命令行输入jconsole,弹出界面选择远程连接,输入地址localhost:10014;

进程jconsole界面后,选择MBean界面,对自定义MBean进行调用,如:

staticConfigManagerMBean -> staticConfigManager -> 操作 -> changeConfigName,打印静态类的静态属性;

staticConfigManagerMBean -> staticConfigManager -> 操作 -> printConfigName,修改静态类的静态属性;

相关文章

Java开发中的POJO、Dto、PO、Vo傻傻分不清楚?一文看懂

在Java开发的过程中,常常遇到这样的包名,如entity、bo、vo、po、dto、pojo等,许多初学者看到这样的词语都回感到迷惑,下面这一篇就把这些不同而又容易让人产生迷惑的实体类做一个很好的区...

阿里资深架构师整理分享60道全套Java核心技术面...

大家想不想进入一线大厂来进行自我提升、涨薪跳槽呢?今天就给大家分享一波阿里资深架构师整理分享出的60道必备的Java核心技术面试题及答案,希望大家能够喜欢!文末还有大量面试题分享,不止这60道!!60...

Java内存模型(JMM)详解

在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型。它们的答案是一致的:能够让我们更好的...

Java动态字节技术之Javassist

概述Javassist是一个开源的分析、编辑和创建Java字节码的类库,可以直接编辑和生成Java生成的字节码。相对于bcel, asm等这些工具,开发者不需要了解虚拟机指令,就能动态改变类的结构,或...

Java——API

腾讯云 API 全新升级3.0,该版本进行了性能优化且全地域部署、支持就近和按地域接入、访问时延下降显著,接口描述更加详细、错误码描述更加全面、SDK 增加接口级注释,让您更加方便快捷的使用腾讯云产品...

Java内存溢出(OOM)分析

当JVM内存不足时,会抛出java.lang.OutOfMemoryError.主要的OOM类型右:Java heap space:堆空间不足GC overhead limit exceeded :...