【最小demo】JMX (Java Management Extensions)演示最小Demo

参考 JMX超详细解读 https://www.cnblogs.com/dongguacai/p/5900507.html

JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。

JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。
个人的理解是JMX让程序有被管理的功能,例如你开发一个WEB网站,它是在24小时不间断运行,那么你肯定会对网站进行监控,如每天的UV、PV是多少;又或者在业务高峰的期间,你想对接口进行限流,就必须去修改接口并发的配置值。

应用场景:中间件软件WebLogic的管理页面就是基于JMX开发的,而JBoss则整个系统都基于JMX构架。
在这里插入图片描述
从图中我们可以看到,JMX的结构一共分为三层:

1、基础层:主要是MBean,被管理的资源。
2、适配层:MBeanServer,主要是提供对资源的注册和管理。
3、接入层:提供远程访问的入口。

最小demo演示开始

HelloMBean

首先定义一个MBean接口,接口的命名规范为以具体的实现类为前缀(这个规范很重要)

package com.example.jmx;
//首先定义一个MBean接口,接口的命名规范为以具体的实现类为前缀(这个规范很重要)
public interface HelloMBean {
    public String getName();

    public void setName(String name);

    public String getAge();

    public void setAge(String age);

    public void helloWorld();

    public void helloWorld(String str);

    public void getTelephone();
}

Hello implements HelloMBean

package com.example.jmx;

/*
 * 该类名称必须与实现的接口的前缀保持一致(即MBean前面的名称
 */
public class Hello implements HelloMBean
{
    private String name;

    private String age;

    @Override
    public void getTelephone()
    {
        System.out.println("get Telephone");
    }
    @Override
    public void helloWorld()
    {
        System.out.println("hello world");
    }
    @Override
    public void helloWorld(String str)
    {
        System.out.println("helloWorld:" + str);
    }
    @Override
    public String getName()
    {
        System.out.println("get name"+name);
        return name;
    }
    @Override
    public void setName(String name)
    {
        System.out.println("set name 123");
        this.name = name;
    }
    @Override
    public String getAge()
    {
        System.out.println("get age"+age);
        return age;
    }
    @Override
    public void setAge(String age)
    {
        System.out.println("set age 123");
        this.age = age;
    }
}

HelloAgent0

package com.example.jmx;

import com.sun.jdmk.comm.HtmlAdaptorServer;

import java.lang.management.ManagementFactory;

import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;

public class HelloAgent0
{
    public static void main(String[] args) throws JMException, Exception
    {
        //通过工厂类获取MBeanServer,用来做MBean的容器 。
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        //ObjectName中的取名是有一定规范的,
        // 格式为:“域名:name=MBean名称”,
        // 其中域名和MBean的名称可以任意取。
        // 这样定义后,就可以唯一标识我们定义的这个MBean的实现类了。
        ObjectName helloName = new ObjectName("jmxBean:name=hello");
        //create mbean and register mbean
        //将Hello这个类注入到MBeanServer中,注入需要创建一个ObjectName类
        server.registerMBean(new Hello(), helloName);
        //Thread.sleep(60*60*1000);

        //一个简单的JMX的DEMO已经写完了
        //通过JDK提供的Jconsole来进行操作

        //通过JMX提供的工具页访问
        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
        HtmlAdaptorServer adapter = new HtmlAdaptorServer();
        server.registerMBean(adapter, adapterName);
        adapter.start();


    }
}

JDK的小工具Jconsole访问

在这里插入图片描述

通过JMX提供的工具页访问 http://localhost:8082/在这里插入图片描述

扩展通过RMI,远程方法调用,client可以通过RPC的方式远程调用

HelloAgent 服务端注册

(“service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi”);

package com.example.jmx;

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

public class HelloAgent
{
    public static void main(String[] args) throws JMException, NullPointerException
    {
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        ObjectName helloName = new ObjectName("jmxBean:name=hello");
        //create mbean and register mbean
        server.registerMBean(new Hello(), helloName);
        try
        {
            //这个步骤很重要,注册一个端口,绑定url后用于客户端通过rmi方式连接JMXConnectorServer
            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);
            System.out.println("begin rmi start");
            jcs.start();
            System.out.println("rmi start");
        }
        catch (RemoteException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }}

Client 客户端通过rmi远程调用

package com.example.jmx;

import java.io.IOException;

import javax.management.Attribute;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;


public class Client
{
    public static void main(String[] args) throws IOException, Exception, NullPointerException
    {
        JMXServiceURL url = new JMXServiceURL
                ("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
        JMXConnector jmxc = JMXConnectorFactory.connect(url,null);

        MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
        //ObjectName的名称与前面注册时候的保持一致
        ObjectName mbeanName = new ObjectName("jmxBean:name=hello");

        System.out.println("Domains ......");
        String[] domains = mbsc.getDomains();

        for(int i=0;i<domains.length;i++)
        {
            //System.out.println("doumain[" + i + "]=" + domains[i] );
        }

        System.out.println("MBean count = " + mbsc.getMBeanCount());
        //设置指定Mbean的特定属性值
        //这里的setAttribute、getAttribute操作只能针对bean的属性
        //例如对getName或者setName进行操作,只能使用Name,需要去除方法的前缀
        mbsc.setAttribute(mbeanName, new Attribute("Name","杭州"));
        mbsc.setAttribute(mbeanName, new Attribute("Age","1990"));
        String age = (String)mbsc.getAttribute(mbeanName, "Age");
        String name = (String)mbsc.getAttribute(mbeanName, "Name");
        System.out.println("age=" + age + ";name=" + name);

        HelloMBean proxy = MBeanServerInvocationHandler.
                newProxyInstance(mbsc, mbeanName, HelloMBean.class, false);
        proxy.helloWorld();
        proxy.helloWorld("migu");
        proxy.getTelephone();
        //invoke调用bean的方法,只针对非设置属性的方法
        //例如invoke不能对getName方法进行调用
        mbsc.invoke(mbeanName, "getTelephone", null, null);
        mbsc.invoke(mbeanName, "helloWorld",
                new String[]{"I'll connect to JMX Server via client2"}, new String[]{"java.lang.String"});
        mbsc.invoke(mbeanName, "helloWorld", null, null);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值