老弟,你都工作3年了,连JMX都不知道,不应该啊。。。

沙海 2021年5月24日04:35:01Java评论32字数 5992阅读19分58秒阅读模式
摘要

速读摘要

速读摘要文章源自JAVA秀-https://www.javaxiu.com/25369.html

全称Java Management Extensions,用于我们管理和监控java应用程序。用来管理相应的资源,并且为远端用户提供访问的接口。通过这个界面,我们可以查看和设置user的属性,或调用它的方法。通过以上例子,可以看到,JMX还是非常有用的,除了查看类的属性外,我们还可以在不重启程序的情况下进行配置或执行某些方法。当我们在启动参数中存在以下参数时,默认会去读取$JRE/lib/management/management.properties的配置文件。文章源自JAVA秀-https://www.javaxiu.com/25369.html

原文约 2666 | 图片 14 | 建议阅读 6 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/25369.html

老弟,你都工作3年了,连JMX都不知道,不应该啊。。。

点击关注 ? Java面试那些事儿 文章源自JAVA秀-https://www.javaxiu.com/25369.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/25369.html

#Java面试那些事儿文章源自JAVA秀-https://www.javaxiu.com/25369.html

127个文章源自JAVA秀-https://www.javaxiu.com/25369.html

大家好,我是D哥点击关注下方公众号,Java面试资料 都在这里

文章源自JAVA秀-https://www.javaxiu.com/25369.html

来源:https://urlify.cn/aaAjea

# 什么是JMX

文章源自JAVA秀-https://www.javaxiu.com/25369.html

JMX,全称Java Management Extensions,用于我们管理和监控java应用程序。JMX有以下用途:文章源自JAVA秀-https://www.javaxiu.com/25369.html

文章源自JAVA秀-https://www.javaxiu.com/25369.html

  1. 监控应用程序的运行状态和相关统计信息。文章源自JAVA秀-https://www.javaxiu.com/25369.html

  2. 修改应用程序的配置(无需重启)。文章源自JAVA秀-https://www.javaxiu.com/25369.html

  3. 状态变化或出错时通知处理。文章源自JAVA秀-https://www.javaxiu.com/25369.html

举个例子,我们可以通过jconsole监控应用程序的堆内存使用量、线程数、类数,查看某些配置信息,甚至可以动态地修改配置。另外,有时还可以利用JMX来进行测试。文章源自JAVA秀-https://www.javaxiu.com/25369.html

文章源自JAVA秀-https://www.javaxiu.com/25369.html

本文将介绍以下内容:文章源自JAVA秀-https://www.javaxiu.com/25369.html

文章源自JAVA秀-https://www.javaxiu.com/25369.html

  1. 什么是JMX;文章源自JAVA秀-https://www.javaxiu.com/25369.html

  2. JMX的基础架构;文章源自JAVA秀-https://www.javaxiu.com/25369.html

  3. 如何使用JMX。文章源自JAVA秀-https://www.javaxiu.com/25369.html

# JMX的基础架构

文章源自JAVA秀-https://www.javaxiu.com/25369.html

首先,看下这种图:文章源自JAVA秀-https://www.javaxiu.com/25369.html

老弟,你都工作3年了,连JMX都不知道,不应该啊。。。文章源自JAVA秀-https://www.javaxiu.com/25369.html

这里简单介绍下这三层结构:文章源自JAVA秀-https://www.javaxiu.com/25369.html

层次描述
Instrumentation主要包括了一系列的接口定义和描述如何开发MBean的规范。在JMX中MBean代表一个被管理的资源实例,通过MBean中暴露的方法和属性,外界可以获取被管理的资源的状态和操纵MBean的行为。
Agent用来管理相应的资源,并且为远端用户提供访问的接口。该层的核心是MBeanServer,所有的MBean都要向它注册,才能被管理。注册在MBeanServer上的MBean并不直接和远程应用程序进行通信,他们通过协议适配器(Adapter)和连接器(Connector)进行通信。
Distributed定义了一系列用来访问Agent的接口和组件,包括Adapter和Connector的描述。注意,Adapter 和Connector的区别在于:Adapter是使用某种Internet协议来与 Agent获得联系,Agent端会有一个对象 (Adapter)来处理有关协议的细节。比如SNMP Adapter和HTTP Adapter。而Connector则是使用类似RPC的方式来访问Agent,在Agent端和客户端都必须有这样一个对象来处理相应的请求与应答。比如RMI Connector。

# 怎么使用JMX

文章源自JAVA秀-https://www.javaxiu.com/25369.html

需求

文章源自JAVA秀-https://www.javaxiu.com/25369.html

  1. 测试本地连接管理MBean。文章源自JAVA秀-https://www.javaxiu.com/25369.html

  2. 测试远程连接管理MBean,包括代码实现、启动参数、启动参数+配置文件等方式。文章源自JAVA秀-https://www.javaxiu.com/25369.html

  3. 如何开启账号密码认证。文章源自JAVA秀-https://www.javaxiu.com/25369.html

工程环境

文章源自JAVA秀-https://www.javaxiu.com/25369.html

JDK:1.8.0_231文章源自JAVA秀-https://www.javaxiu.com/25369.html

maven:3.6.1文章源自JAVA秀-https://www.javaxiu.com/25369.html

IDE:eclipse 4.12文章源自JAVA秀-https://www.javaxiu.com/25369.html

主要步骤

文章源自JAVA秀-https://www.javaxiu.com/25369.html

  1. 定义MBean接口,并编写实现类;文章源自JAVA秀-https://www.javaxiu.com/25369.html

  2. 注册MBean到MBeanServe;文章源自JAVA秀-https://www.javaxiu.com/25369.html

  3. 启动程序;文章源自JAVA秀-https://www.javaxiu.com/25369.html

  4. 使用jconsole连接管理该程序。文章源自JAVA秀-https://www.javaxiu.com/25369.html

创建项目

文章源自JAVA秀-https://www.javaxiu.com/25369.html

项目类型Maven Project,打包方式jar文章源自JAVA秀-https://www.javaxiu.com/25369.html

引入依赖

文章源自JAVA秀-https://www.javaxiu.com/25369.html

入门案例暂时不需要引入外部依赖。文章源自JAVA秀-https://www.javaxiu.com/25369.html

编写MBean接口

文章源自JAVA秀-https://www.javaxiu.com/25369.html

注意,接口名格式必须为:被管理的类的类名+MBean。文章源自JAVA秀-https://www.javaxiu.com/25369.html

    publicinterfaceUserMBean {String getName();voidsetName(String name);Integer getAge();voidsetAge(Integer age);String getAddress();voidsetAddress(String address);String sayHello();}
    文章源自JAVA秀-https://www.javaxiu.com/25369.html

    编写实现类

    文章源自JAVA秀-https://www.javaxiu.com/25369.html

    这里简单实现下就行。当属性被设置时,会在控制台打印相关内容。文章源自JAVA秀-https://www.javaxiu.com/25369.html

      publicclassUserimplementsUserMBean{private String name;private Integer age;private String address;public String getName(){return name; }publicvoidsetName(String name){ System.err.println("set name to " + name);this.name = name; }public Integer getAge(){return age; }publicvoidsetAge(Integer age){ System.err.println("set age to " + age);this.age = age; }public String getAddress(){return address; }publicvoidsetAddress(String address){ System.err.println("set address to " + address);this.address = address; }public String sayHello(){return"Hello!"; }}
      文章源自JAVA秀-https://www.javaxiu.com/25369.html

      本地连接

      文章源自JAVA秀-https://www.javaxiu.com/25369.html

      注册MBean

      文章源自JAVA秀-https://www.javaxiu.com/25369.html

      路径为test目录下的cn.zzs.jmx,类名JMXTest。只有将MBean注册到MBeanServer,MBean才能被管理。MBean的对象名格式为:域名:type=MBean类型,name=MBean名称。其中,域名和MBean名称可以随便取,对象名中除了type,我们还可以自定义其他条目,以方便管理。文章源自JAVA秀-https://www.javaxiu.com/25369.html

      文章源自JAVA秀-https://www.javaxiu.com/25369.html

      注意,为了让这个程序持续工作,这里强制线程睡眠。文章源自JAVA秀-https://www.javaxiu.com/25369.html

        publicstaticvoid main(String[] args) throws Exception {// 设置MBean对象名,格式为:“域名:type=MBean类型,name=MBean名称”String jmxName = "cn.zzs.jmx:type=user,name=user001";// 获得MBeanServer MBeanServer server = ManagementFactory.getPlatformMBeanServer();// 创建ObjectName ObjectName objectName = new ObjectName(jmxName);// 创建并注册MBean server.registerMBean(new User(), objectName); Thread.sleep(60 * 60 * 1000);  }
        文章源自JAVA秀-https://www.javaxiu.com/25369.html

        测试

        文章源自JAVA秀-https://www.javaxiu.com/25369.html

        启动程序,打开jconsole(在JDK安装路径的bin目录下),出现如下界面,这时可以看到我们测试的程序:文章源自JAVA秀-https://www.javaxiu.com/25369.html

        老弟,你都工作3年了,连JMX都不知道,不应该啊。。。文章源自JAVA秀-https://www.javaxiu.com/25369.html

        选择JMXTest后,点击连接,这时如果弹窗“安全连接失败,是否以不安全的方式重试”,这是因为我们没有开启ssl加密,可以不去理会它。点击不安全的连接,即可进入以下页面:文章源自JAVA秀-https://www.javaxiu.com/25369.html

        老弟,你都工作3年了,连JMX都不知道,不应该啊。。。文章源自JAVA秀-https://www.javaxiu.com/25369.html

        通过这个窗口我们可以查看程序的堆内存使用量、线程、类等信息,我们再点击MBean选项卡,可以看到我们编写的MBean,我们定义的对象名为cn.zzs.jmx:type=user,name=user001,其中cn.zzs.jmx作为第一级目录,type=user作为第二级目录,name=user001对应具体的对象,它具备属性和操作。其中,user的setter和getter方法被合并在了一起。文章源自JAVA秀-https://www.javaxiu.com/25369.html

        老弟,你都工作3年了,连JMX都不知道,不应该啊。。。文章源自JAVA秀-https://www.javaxiu.com/25369.html

        通过这个界面,我们可以查看和设置user的属性,或调用它的方法。例如,我先设置name的值,通过程序控制台可以看到该方法被调用了:文章源自JAVA秀-https://www.javaxiu.com/25369.html

        老弟,你都工作3年了,连JMX都不知道,不应该啊。。。文章源自JAVA秀-https://www.javaxiu.com/25369.html

        接着我再调用sayHello方法:文章源自JAVA秀-https://www.javaxiu.com/25369.html

        老弟,你都工作3年了,连JMX都不知道,不应该啊。。。文章源自JAVA秀-https://www.javaxiu.com/25369.html

        通过以上例子,可以看到,JMX还是非常有用的,除了查看类的属性外,我们还可以在不重启程序的情况下进行配置或执行某些方法。文章源自JAVA秀-https://www.javaxiu.com/25369.html

        文章源自JAVA秀-https://www.javaxiu.com/25369.html

        以上例子中,我们只能在本地访问JMXTest,接下来介绍如何实现远程连接。本文介绍三种方式,可根据实际场景选择:文章源自JAVA秀-https://www.javaxiu.com/25369.html

        文章源自JAVA秀-https://www.javaxiu.com/25369.html

        1. 代码实现;文章源自JAVA秀-https://www.javaxiu.com/25369.html

        2. 启动参数配置;文章源自JAVA秀-https://www.javaxiu.com/25369.html

        3. 启动参数+文件配置。文章源自JAVA秀-https://www.javaxiu.com/25369.html

        远程连接方式一(代码实现)

        文章源自JAVA秀-https://www.javaxiu.com/25369.html

        本例子在本地连接的基础上修改。文章源自JAVA秀-https://www.javaxiu.com/25369.html

        文章源自JAVA秀-https://www.javaxiu.com/25369.html

        开启远程连接

        文章源自JAVA秀-https://www.javaxiu.com/25369.html

        注意,这里的localhost最好改为你的IP,不然可能连接不上。文章源自JAVA秀-https://www.javaxiu.com/25369.html

          publicstaticvoid main(String[] args) throws Exception {// 设置MBean对象名,格式为:“域名:type=MBean类型,name=MBean名称”String jmxName = "cn.zzs.jmx:type=user,name=user001";// 获得MBeanServer MBeanServer server = ManagementFactory.getPlatformMBeanServer();// 创建ObjectName ObjectName objectName = new ObjectName(jmxName);// 创建并注册MBean server.registerMBean(new User(), objectName);// 注册一个端口 LocateRegistry.createRegistry(9999);// URL路径的结尾可以随意指定,但如果需要用Jconsole来进行连接,则必须使用jmxrmi JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi"); JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server); jcs.start();  }
          文章源自JAVA秀-https://www.javaxiu.com/25369.html

          测试

          文章源自JAVA秀-https://www.javaxiu.com/25369.html

          打开jconsole,使用远程连接方式,输入我们设置好的ip和端口,点击连接即可:文章源自JAVA秀-https://www.javaxiu.com/25369.html

          老弟,你都工作3年了,连JMX都不知道,不应该啊。。。文章源自JAVA秀-https://www.javaxiu.com/25369.html

          远程连接方式二(启动参数)

          文章源自JAVA秀-https://www.javaxiu.com/25369.html

          本例子在本地连接的基础上修改。在程序启动时加入以下启动参数,也可以实现远程连接:文章源自JAVA秀-https://www.javaxiu.com/25369.html

            -Djava.rmi.server.hostname=<your-ip> // 你的ip-Dcom.sun.management.jmxremote.port=9999// 开放端口号-Dcom.sun.management.jmxremote.local.only=false// 是否只能本地连接-Dcom.sun.management.jmxremote.ssl=false// 是否使用ssl加密-Dcom.sun.management.jmxremote.authenticate=false // 是否需要账号密码认证
            文章源自JAVA秀-https://www.javaxiu.com/25369.html

            可以看到,我们关闭了ssl加密和账号密码认证。文章源自JAVA秀-https://www.javaxiu.com/25369.html

            远程连接方式三(启动参数+配置文件)

            文章源自JAVA秀-https://www.javaxiu.com/25369.html

            本例子在本地连接的基础上修改。文章源自JAVA秀-https://www.javaxiu.com/25369.html

            启动参数

            文章源自JAVA秀-https://www.javaxiu.com/25369.html

            在程序启动时加入以下启动参数,并结合配置文件,也可以实现远程连接:文章源自JAVA秀-https://www.javaxiu.com/25369.html

              -Dcom.sun.management.config.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/management.properties // 配置文件路径-Djava.rmi.server.hostname=<your-ip>
              文章源自JAVA秀-https://www.javaxiu.com/25369.html

              配置文件

              文章源自JAVA秀-https://www.javaxiu.com/25369.html

              在配置文件中配置以下参数:文章源自JAVA秀-https://www.javaxiu.com/25369.html

                # 开放端口号com.sun.management.jmxremote.port=9999# 是否只能本地连接com.sun.management.jmxremote.local.only=false# 是否使用ssl加密com.sun.management.jmxremote.ssl=false# 是否需要账号密码认证com.sun.management.jmxremote.authenticate=false
                文章源自JAVA秀-https://www.javaxiu.com/25369.html

                关于management.propertie的详细配置,可以在$JRE/lib/management/目录下找到。其实,当我们在启动参数中存在以下参数时,默认会去读取$JRE/lib/management/management.properties的配置文件。文章源自JAVA秀-https://www.javaxiu.com/25369.html

                  # -Dcom.sun.management.jmxremote.port=<port-number># or -Dcom.sun.management.snmp.port=<port-number>
                  文章源自JAVA秀-https://www.javaxiu.com/25369.html

                  设置账户密码

                  文章源自JAVA秀-https://www.javaxiu.com/25369.html

                  实际使用中,我们更希望采用安全加密的方式来监控程序,这个时候我们可以设置ssl加密或账号密码认证。ssl加密的本文暂时不扩展,这里只介绍如何设置账号密码认证。文章源自JAVA秀-https://www.javaxiu.com/25369.html

                  文章源自JAVA秀-https://www.javaxiu.com/25369.html

                  启动参数

                  文章源自JAVA秀-https://www.javaxiu.com/25369.html

                  和上个例子一样,需要设置如下启动参数:文章源自JAVA秀-https://www.javaxiu.com/25369.html

                    -Dcom.sun.management.config.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/management.properties-Djava.rmi.server.hostname=<your-ip>
                    文章源自JAVA秀-https://www.javaxiu.com/25369.html

                    配置文件

                    文章源自JAVA秀-https://www.javaxiu.com/25369.html

                    配置文件中加入以下内容:文章源自JAVA秀-https://www.javaxiu.com/25369.html

                      # 开放端口号com.sun.management.jmxremote.port=9999# 是否只能本地连接com.sun.management.jmxremote.local.only=false# 是否使用ssl加密com.sun.management.jmxremote.ssl=false# 是否需要账号密码认证com.sun.management.jmxremote.authenticate=true# 密码文件路径com.sun.management.jmxremote.password.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/jmxremote.password# 权限文件路径com.sun.management.jmxremote.access.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/jmxremote.access
                      文章源自JAVA秀-https://www.javaxiu.com/25369.html

                      在此之前,我们需要配置好密码文件和权限文件:文章源自JAVA秀-https://www.javaxiu.com/25369.html

                      密码文件文章源自JAVA秀-https://www.javaxiu.com/25369.html

                        ZhangZiSheng001 root
                        文章源自JAVA秀-https://www.javaxiu.com/25369.html

                        权限文件文章源自JAVA秀-https://www.javaxiu.com/25369.html

                          ZhangZiSheng001 readwrite
                          文章源自JAVA秀-https://www.javaxiu.com/25369.html

                          测试

                          文章源自JAVA秀-https://www.javaxiu.com/25369.html

                          打开jconsole,选择远程连接,并输入账号密码,点击连接即可:文章源自JAVA秀-https://www.javaxiu.com/25369.html

                          老弟,你都工作3年了,连JMX都不知道,不应该啊。。。文章源自JAVA秀-https://www.javaxiu.com/25369.html

                          老弟,你都工作3年了,连JMX都不知道,不应该啊。。。热门推荐:文章源自JAVA秀-https://www.javaxiu.com/25369.html

                          转太强了!这是我见过最好用的远程桌面工具(附源码)卧槽!你竟然连SpringBoot中的线程池都不会用分享一个基于 SpringMvc + OpenCV 的答题卡识别系统简历&面试题&视频资料获取 扫描下方二维码,回复关键字【 java】
                          文章源自JAVA秀-https://www.javaxiu.com/25369.html
                          继续阅读
                          速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
                          weinxin
                          资源分享QQ群
                          本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
                          沙海
                          匿名

                          发表评论

                          匿名网友 填写信息

                          :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

                          确定