乐趣区

关于java:JMX案例

JMX(Java Management Extensions) 是一个为应用程序植入治理性能的框架。JMX 是一套规范的代理和服务,次要用于对 JAVA 应用程序和 JVM 进行监控和治理。
JConsole 和 JVisualVM 中可能监控到 JAVA 应用程序和 JVM 的相干信息都是通过 JMX 实现的。

 散布层:是 JMX 架构对外一层,散布层负责应用 JMX 代理对外部世界可用。有两种类型的分布式交互。第一种类型是由适配器来实现,它通过 HTTP 或 SNMP 一类的协定提供了 MBean 的可见性。第二种类型是连接器,它将代理的 API 裸露给其它分布式技术,如 Java RMI。(治理拜访框架接口)代理层:代理层次要组件是 MBean 服务器,MBean 服务器提供 MBean 的注册应用,它是 JMX 代理的外围。(拜访资源接口)指令层:指令层是靠近治理资源的一层,它由代理中注册的 MBean 形成 MBean 使得资源能够通过代理来被治理。(解决资源)
package test;

/**
 * MBean 中各办法的参数和返回值的类型做严格限度,* 这些类型只能是根本类型 (String,int,double,float...)
 * 以及 JMX 标准指定的 CompositeDataSupport(用于组合根本类型)*/
public class Hello implements HelloMBean {public void sayHello() {System.out.println("hello, world");
    }

    public int add(int x, int y) {System.out.println("add done"+x+" "+y);
        return x + y;
    }

    public String getName() {return this.name;}

    public int getCacheSize() {return this.cacheSize;}

    public synchronized void setCacheSize(int size) {
        this.cacheSize = size;
        System.out.println("Cache size now" + this.cacheSize);
    }

    private final String name = "Reginald";
    private int cacheSize = DEFAULT_CACHE_SIZE;
    private static final int DEFAULT_CACHE_SIZE = 200;
}
package test;

import javax.management.Notification;
import javax.management.NotificationListener;

public class HelloListener implements NotificationListener {public void handleNotification(Notification notification, Object handback) {if (handback instanceof Hello) {Hello hello = (Hello) handback;
            hello.add(Integer.parseInt(notification.getMessage()), 1);
        }
    }

}
package test;

/**
 * 接口名必须以 MBean 结尾
 */
public interface HelloMBean {public void sayHello();
    public int add(int x, int y);

    public String getName();

    public int getCacheSize();
    public void setCacheSize(int size);
}
package test;

import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;

public class Jack extends NotificationBroadcasterSupport implements JackMBean {
    private int seq = 0;

    public void say(int a) {
        // 创立一个信息包
        Notification notify =
                // 告诉名称;谁发动的告诉;序列号;发动告诉工夫;发送的音讯
                new Notification("jack.hi", this, ++seq, System.currentTimeMillis(), a+"");
        sendNotification(notify);
    }
}
package test;

public interface JackMBean {void say(int a);
}
package test;

import javax.management.MBeanInfo;
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;

/*
  ClassLoadingMXBean Java 虚拟机的类加载零碎。CompilationMXBean Java 虚拟机的编译系统。MemoryMXBean Java 虚拟机的内存零碎。ThreadMXBean Java 虚拟机的线程零碎。RuntimeMXBean Java 虚拟机的运行时零碎。OperatingSystemMXBean Java 虚拟机在其上运行的操作系统。GarbageCollectorMXBean Java 虚拟机中的垃圾回收器。MemoryManagerMXBean Java 虚拟机中的内存管理器。MemoryPoolMXBean Java 虚拟机中的内存池。*/
public class JMXClient {public static void main(String[] args) throws Exception {
        JMXServiceURL url =
                new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:9999/jmxrmi");
        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
        MBeanServerConnection conn = jmxc.getMBeanServerConnection();
        String[] domains = conn.getDomains();
        for (String domain : domains) {// System.out.println(domain);
        }
        ObjectName name = new ObjectName("test:type=Hello");
        MBeanInfo mBeanInfo = conn.getMBeanInfo(name);
        // 获取 mbean 信息
        System.out.println(mBeanInfo.toString());
        // 获取属性
        Object o = conn.getAttribute(name, "CacheSize");
        System.out.println(o);
        Object o2 = conn.getAttribute(name, "Name");
        System.out.println(o2);
        HelloMBean helloMBean = MBeanServerInvocationHandler.newProxyInstance(conn, name, HelloMBean.class, true);
        // 调用办法
        helloMBean.sayHello();
        // 设置值
        helloMBean.setCacheSize(100);
        ObjectName name2 = new ObjectName("test:type=Jack");
        JackMBean jackMBean = MBeanServerInvocationHandler.newProxyInstance(conn, name2,
                JackMBean.class, true);
        jackMBean.say(2);
        // 获取 jvm 自带的
        ObjectName o3 = new ObjectName("java.lang:type=ClassLoading");
        MBeanInfo  mBeanInfo1 = conn.getMBeanInfo(o3);
        Object TotalLoadedClassCount = conn.getAttribute(o3,"TotalLoadedClassCount");
        System.out.println(mBeanInfo1);
        System.out.println(TotalLoadedClassCount);
    }
}
package test;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;

/**
 * 如果要近程拜访,被拜访 Mbean 服务器首选须要 命令行选项启动近程虚拟机,这些选项设置虚拟机的相干 JMX 代理侦听申请的端口,以及起作用的安全级别如下:* -Dcom.sun.management.jmxremote.port=9999 -- 指定端口
 * -Dcom.sun.management.jmxremote.authenticate=false – 指定是否须要明码验证
 * -Dcom.sun.management.jmxremote.ssl=false – 指定是否应用 SSL 通信
 */
public class JMXServer {public static void main(String[] args) throws Exception {
        /**
         * 1、通过工厂类获取 Mbean Server,用来做 Mbean 的容器
         * 2、ObjectName 的取名标准:域名:name=Mbean 名称,其中域名和 Mbean 的名称能够任取。这样定义后,咱们能够惟一标示咱们定义的这个 Mbean 的实现类了
         * 3、最初将 Hello 这个类注册到 MbeanServer 中,注入须要创立一个 ObjectName 类
         */
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        ObjectName name = new ObjectName("test:type=Hello");
        Hello mbean = new Hello();
        mbs.registerMBean(mbean, name);
        ObjectName name2 = new ObjectName("test:type=Jack");
        Jack jack = new Jack();
        // 设置告诉
        jack.addNotificationListener(new HelloListener(),null,mbean);
        mbs.registerMBean(jack, name2);
        System.out.println("Waiting forever...");
        Thread.sleep(Long.MAX_VALUE);
    }
}
退出移动版