首页 > 其他分享 >二、JMX自定义MBean

二、JMX自定义MBean

时间:2023-06-03 18:13:36浏览次数:35  
标签:JMX String 自定义 ObjectName hello MBean new public name

一、自定义MBean

public interface HelloMBean {

     String getName();
     void setName(String name);


     String print();
}

HelloMBean必须以MBean结尾。

@Slf4j
public class Hello implements HelloMBean {

    private String name;
    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String print() {
        log.info(name);
        return name;
    }
}

@Slf4j是lombok注解。HelloMBean的名称去除MBean后必须是Hello,不能是其他名称。这里的资源是Hello,MBean的接口是必须是HelloMBean

在启动类注册MBean:

@SpringBootApplication
@MapperScan("com.example.mytest.mapper")
public class MyTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyTestApplication.class, args);

        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();

        Hello hello = new Hello();
        hello.setName("张三");
        try {
            // ObjectName规范是包名:type=接口名,name=MBean名
            ObjectName objectName = new ObjectName("com.example.mytest.mbean:type=HelloMBean,name=hello");
            platformMBeanServer.registerMBean(hello, objectName);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

启动程序后,再启动jconsole:
 

 

 

点击属性后,将属性修改为李四,点击下面的刷新。在点击hello MBean的操作:
 

 

属性已经修改为李四。查看控制台:

2023-06-03 16:37:19.095  INFO 71617 --- [on(7)-127.0.0.1] com.example.mytest.mbean.Hello           : 李四

在web访问

如果要在web发布,可以使用HtmlAdaptorServer适配器,先引入依赖:

    <dependency>
        <groupId>org.glassfish.external</groupId>
        <artifactId>opendmk_jdmkrt_jar</artifactId>
        <version>1.0-b01-ea</version>
    </dependency>

将启动类修改为:

@SpringBootApplication
@MapperScan("com.example.mytest.mapper")
public class MyTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyTestApplication.class, args);

        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();

        Hello hello = new Hello();
        hello.setName("张三");
        try {
            ObjectName objectName = new ObjectName("com.example.mytest.mbean:type=HelloMBean,name=hello");
            platformMBeanServer.registerMBean(hello, objectName);

            HtmlAdaptorServer html = new HtmlAdaptorServer();
            ObjectName adaptorName = new ObjectName("adapator:name=HtmlAdaptor");
            html.setPort(9097);
            MBeanServer platformMBeanServer1 = ManagementFactory.getPlatformMBeanServer();
            platformMBeanServer1.registerMBean(html, adaptorName);
            html.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

访问http://localhost:9097/,看到:
 

 
点击type=HelloMBean,name=hello:
 

 

可以看到中文乱码了。

 

开放远程访问

如果要开放端口,可以添加JVM参数:

-Dcom.sun.management.jmxremote.port=19999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

第一个参数表示在19999端口监听JMX连接,第二个和第三个参数表示无需验证,不使用SSL连接,在开发测试阶段比较方便,生产环境必须指定验证方式并启用SSL。

 

启动后,在jconsole中输入:
 

 

二、自定义MXBean

public interface MyHelloExampleMXBean {

     String getName();

     void setName(String name) ;

    String print();
}

public class MyHello implements MyHelloExampleMXBean{

    private String name;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String print() {
        return name;
    }
}

修改启动类:

@SpringBootApplication
@MapperScan("com.example.mytest.mapper")
public class MyTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyTestApplication.class, args);

        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();

        Hello hello = new Hello();
        hello.setName("张三");

        MyHello myHello = new MyHello();
        myHello.setName("李四");
        try {
            ObjectName objectName = new ObjectName("com.example.mytest.mbean:type=HelloMBean,name=hello");
            platformMBeanServer.registerMBean(hello, objectName);

            platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
            objectName = new ObjectName("com.example.mytest.mbean:type=MyHelloExampleMXBean,name=myHello");
            platformMBeanServer.registerMBean(myHello, objectName);

            HtmlAdaptorServer html = new HtmlAdaptorServer();
            ObjectName adaptorName = new ObjectName("adapator:name=HtmlAdaptor");
            html.setPort(9097);
            MBeanServer platformMBeanServer1 = ManagementFactory.getPlatformMBeanServer();
            platformMBeanServer1.registerMBean(html, adaptorName);
            html.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

可以看到MyHelloExampleMXBean只要以MXBean结尾就可以随便命名。

三、在Spring中定义MBean

MyController:

@Value("${my.value}")
private String myValue;

private Set<String> set = new HashSet<>();

public void add(String s) {
    set.add(s);
}


public Set<String> getSet() {
    return set;
}

MyControllerMXBean

@Slf4j
@Component
@ManagedResource(objectName = "controller:name=myControllerMXBean", description = "MyController Attribute")
public class MyControllerMXBean {

    @Autowired
    private MyController myController;

    @ManagedAttribute(description = "Get Configuration")
    public String getMyValue() {
        String myValue = myController.myValue();
        log.info(myValue);
        return myValue;
    }

    @ManagedAttribute(description = "Get Set")
    public String getSet() {
        Set<String> set = myController.getSet();
        return set.stream().collect(Collectors.joining());
    }

    @ManagedOperation
    @ManagedOperationParameter(name = "s", description = "Add Set Element")
    public void addSet(String s) {
        myController.add(s);
    }
}

@ManagedResource配置ObjectName,@ManagedOperation指示这是个操作。@ManagedAttribute用在方法上,指示这是个属性(必须符合JAVA Bean的规范,即有get,set方法), @ManagedOperationParameter绑定参数。

 

用jconsole连接后:
 

 
调用addSet后再调用getSet查看添加的数据。getMyValue方法是为了演示可以调用到Spring Bean中的方法获取配置。

标签:JMX,String,自定义,ObjectName,hello,MBean,new,public,name
From: https://www.cnblogs.com/shigongp/p/17454169.html

相关文章

  • JMX入门
    一、简介Java管理扩展(JMX)技术是Java平台标准版(JavaSE平台)的标准部分。JMX技术是在Java2平台标准版(J2SE)5.0版本中添加到该平台的。JMX技术提供了一种简单、标准的管理资源(如应用程序、设备和服务)的方法。因为JMX技术是动态的,所以您可以在创建、安装和实现资源时使用它来监视和管......
  • Android 自定义View 之 饼状进度条
    饼状进度条前言正文一、XML样式二、构造方法三、测量四、绘制①绘制描边①绘制进度五、API方法六、使用七、源码前言  前面写了圆环进度条,这次我们来写一个饼状进度条,首先看一下效果图:正文  效果图感觉怎么样呢?下面我们来实现这个自定义View,依然是写在EasyView这个项目中,这......
  • LangChain教程 – 如何构建自定义知识聊天机器人
    您可能已经了解到过去几个月发布的大量AI应用程序。您甚至可能已经开始使用其中的一些。ChatPDF和CustomGPTAI等AI工具已经对人们变得非常有用——这是有充分理由的。您需要滚动浏览50页文档才能找到简单答案的日子已经一去不复返了。相反,您可以依靠AI来完成繁重的工作......
  • odoo14 使用ir.actions.client 自定义弹窗内容
    ir.actions.client介绍ir.actions.client是odooactions事件的一种,触发一个在客户端实现(即js文件中定义的函数,通过core.action_registry.add(tag,函数名)注册到odoo中)动作tag--action在客户端的标识符,一般是一个专用的字符串,在js文件中注册该动作时指定。params(可......
  • 处理 Ionic 5 中的重大变化:删除了Events,如何在ionic 5+版本中实现自定义Events用于旧
    您是否将您的Ionic应用程序升级到v5,而您的应用程序正在使用Events,它不再工作?如果上述情况属实,那么您来对地方了。先讲个小故事——几天前,我看到一条来自离子团队的推文,Ionic5已发布,在看到该推文10分钟后,我仅使用两个命令将我们的一个中型生产应用程序升级到Ionic5和A......
  • 2015.4.24.17.36_pencil_2015.4.24_Pencil教程=自定义组件安装_0.01
    在前面《原型工具Pencil使用介绍》中有说到Pencil支持自定义组件安装,也简易的介绍了安装使用方法,这里再详细的介绍一下如何安装自定义组件。在最新版本的Pencil1.3中,自带的组件库是比较少的,只有三个,但在Pencil1.2版本中自带的组件库有七个,而且1.3个人感觉只是界面布局上的更新,操......
  • Beginner:Client libraries-7实现自定义接口
    目标:在ROS2中学习更多的实现自定义接口背景在指定的接口包中声明接口,有时在一个包中声明、创建、使用所有接口很方便。本教程关注msg接口类型,但是步骤对于其他所有接口类型适用。任务1、创建一个包ros2pkgcreate--build-typeament_cmakemore_interfacesmkdirmore_in......
  • spring cloud gateway 自定义GatewayFilterFactory
    官网地址:https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/#writing-custom-route-predicate-factories参考地址:https://blog.csdn.net/myli92/article/details/127328893importcom.ruoyi.common.core.utils.StringUtils;importorg.springfr......
  • paddleDetection 训练自定义数据集 第二章 开始训练
    paddleDetection训练自定义数据集第二章开始训练上一章数据集制作文章目录paddleDetection训练自定义数据集第二章开始训练一、环境二、安装1.安装miniconda2.安装paddlepaddle3.下载paddleDetection三、训练自定义数据集1.首先选择预训练模型,然后修改配置文件2.训练3.导......
  • paddleOcr 训练自定义数据
    paddleOcr训练自定义数据文章目录paddleOcr训练自定义数据前言一、创建环境二、安装环境三、使用ppocrlabel标注图片1.打开图片目录2.导出标记结果、导出识别结果四、训练1.切分数据2.修改训练的模型yml3.开始训练五、已经训练的模型,有了新数据需要继续训练1.使用恢复训练2.使......