当前位置: 首页 > 后端技术 > Java

JMX案例

时间:2023-04-01 17:02:05 Java

JMX(JavaManagementExtensions)是一个将管理功能植入应用程序的框架。JMX是一套标准的代理和服务,主要用于监控和管理JAVA应用程序和JVM。JConsole和JVisualVM可以通过JMX监控JAVA应用程序和JVM的相关信息。分布层:是JMX架构的外层,分布层负责使用JMX代理使其对外可用。有两种类型的分布式交互。第一种类型由适配器实现,该适配器通过HTTP或SNMP等协议提供MBean可见性。第二种是连接器,它将代理的API暴露给其他分布式技术,例如JavaRMI。(管理访问框架接口)代理层:代理层的主要组成部分是MBean服务器,提供MBean的注册和使用,是JMX代理的核心。(访问资源接口)指令层:指令层是接近于资源管理的一层,它由注册在代理中的MBean组成,以便通过代理管理资源。(处理资源)packagetest;/***MBean中每个方法的参数和返回值的类型都有严格限制,*这些类型只能是基本类型(String,int,double,float...)*和JMX规范指定的CompositeDataSupport(用于组合原始类型)*/publicclassHelloimplementsHelloMBean{publicvoidsayHello(){System.out.println("hello,world");}publicintadd(intx,inty){System.out.println("添加完成"+x+""+y);返回x+y;}publicStringgetName(){returnthis.name;}publicintgetCacheSize(){returnthis.cacheSize;}publicsynchronizedvoidsetCacheSize(intsize){this.cacheSize=size;System.out.println("现在缓存大小"+this.cacheSize);}privatefinalStringname="Reginald";privateintcacheSize=DEFAULT_CACHE_SIZE;privatestaticfinalintDEFAULT_CACHE_SIZE=200;}packagetest;importjavax.management.Notification;importjavax.management.NotificationListener;publicclassHelloListenerimplementsNotificationListener{publicvoidhandleNotification(Notificationnotification,Objecthandback){if(handbackinstanceofHello){Hellohello=(Hello)handback;}hello.add(Integer.parseInt(notification.getMessage()),1);}}}packagetest;/***接口名必须以MBean结尾*/publicinterfaceHelloMBean{publicvoidsayHello();publicintadd(intx,inty);公共字符串getName();公共intgetCacheSize();publicvoidsetCacheSize(intsize);}packagetest;importjavax.management.Notification;importjavax.management.NotificationBroadcasterSupport;公共类JackextendsNotificationBroadcasterSupportimplementsJackMBean{privateintseq=0;publicvoidsay(inta){//创建一个信息包Notificationnotify=//Notificationname;谁发起了通知;序列号;发起通知时间;发送消息newNotification("jack.hi",this,++seq,System.currentTimeMillis(),a+"");发送通知(通知);}}包测试;公共接口JackMBean{voidsay(inta);}包测试;导入javax.management.MBeanInfo;导入javax.management.MBeanServerConnection;导入javax.management.MBeanServerInvocationHandler;导入javax.management.ObjectName;导入javax.management.remote.JMXConnector;导入javax。management.remote.JMXConnectorFactory;importjavax.management.remote.JMXServiceURL;/*  ClassLoadingMXBeanJava虚拟机类加载系统  CompilationMXBeanJava虚拟机编译系统。  MemoryMXBeanJava虚拟机的内存系统。  ThreadMXBeanJava虚拟机的线程系统。  RuntimeMXBeanJava虚拟机的运行时系统。  OperatingSystemMXBeanJava虚拟机运行的操作系统。  GarbageCollectorMXBeanJava虚拟机中的垃圾收集器。  MemoryManagerMXBeanJava虚拟机中的内存管理器。  MemoryPoolMXBeanJava虚拟机中的内存池。*/publicclassJMXClient{publicstaticvoidmain(String[]args)throwsException{JMXServiceURLurl=newJMXServiceURL("service:jmx:rmi:///jndi/rmi://:9999/jmxrmi");JMXConnectorjmxc=JMXConnectorFactory.connect(url,null);MBeanServerConnectionconn=jmxc.getMBeanServerConnection();字符串[]域=conn.getDomains();for(Stringdomain:domains){//System.out.println(domain);}ObjectNamename=newObjectName("test:type=Hello");MBeanInfomBeanInfo=conn.getMBeanInfo(名称);//获取mbean信息System.out.println(mBeanInfo.toString());//获取属性Objecto=conn.getAttribute(name,"CacheSize");System.out.println(o);对象o2=conn.getAttribute(名称,"名称");System.out.println(o2);HelloMBeanhelloMBean=MBeanServerInvocationHandler.newProxyInstance(conn,name,HelloMBean.class,true);//调用方法helloMBean.sayHello();//设置值helloMBean.setCacheSize(100);ObjectNamename2=newObjectName("test:type=Jack");JackMBeanjackMBean=MBeanServerInvocationHandler.newProxyInstance(conn,name2,JackMBean.class,true);jackMBean.say(2);//获取jvm自带的ObjectNameo3=newObjectName("java.lang:type=ClassLoading");MBeanInfomBeanInfo1=conn.getMBeanInfo(o3);对象TotalLoadedClassCount=conn.getAttribute(o3,"TotalLoadedClassCount");System.out.println(mBeanInfo1);System.out.println(TotalLoadedClassCount);}}包测试;导入javax.management.MBeanServer;导入javax.management.ObjectName;导入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通信*/publicclassJMXServer{publicstaticvoidmain(String[]args)throwsException{/***1.通过工厂类获取MbeanServer并用于Mbean容器*2.ObjectName命名规范:域名:name=Mbean名称,其中域名和Mbean的名称可以任意。这样定义之后,我们就可以唯一标记我们定义的Mbean的实现类了*3.最后在MBeanServer中注册了Hello类,注入需要创建一个ObjectName类*/MBeanServermbs=ManagementFactory.getPlatformMBeanServer();ObjectNamename=newObjectName("test:type=Hello");你好mbean=newHello();姆斯。registerMBean(mbean,名称);ObjectNamename2=newObjectName("test:type=Jack");杰克杰克=新杰克();//设置通知jack.addNotificationListener(newHelloListener(),null,mbean);姆斯。registerMBean(jack,name2);System.out.println("永远等待...");Thread.sleep(Long.MAX_VALUE);}}

猜你喜欢