JMX是管理和监控java项目的一种机制,通过编写符合JMX规范的代码,可以暴露出一些属性或者方法,来检查程序运行时的一些情况,修改内存值。
三种MBean编写方式:
一、传统MBean
1.定义要暴露的属性方法接口,强制命名规定为XXXMBean。
2.定义接口实现,强制命名规定为接口名前缀XXX。
代码:
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); //MBeanServer,可以获取内置的,也可以自建 //MBeanServerFactory.createMBeanServer("domainName"); //实现类,实现ImplMBean接口 Impl impl = new Impl(); impl.setName("name"); impl.setSize(5); ObjectName name = new ObjectName("domainName:type=MyType,name=myName"); //domainName:key=value,... //服务命名格式:服务域名称(大分类名):type(小分类名)=?,name(服务名称)=? mbs.registerMBean(impl, name); Thread.sleep(Integer.MAX_VALUE);
这段代码就暴露了impl的属性和方法,可以用JMX客户端(比如JDK内置的JConsole)来连接上来查看。
二、新版MXBean
和传统MBean区别在于不用理会接口和实现类名强制命名规定,可以任意,只用在【接口类】上添加注解@MXBean,实现类没有特别,只用实现该接口即可。
三、继承自DynamicMBean
四、远程访问JMX项目
见http://softbeta.iteye.com/blog/1264833
方式一、RMI Connector方式
①普通验证方式
java程序添加启动参数:-Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
即开放了jmxremote访问,可以用java visualVM或者jconsole来远程访问。 该机器要开放端口8888
若-Dcom.sun.management.jmxremote.authenticate=true(是否开启验证)则会使用jdk/jre/lib/management/jmxremote.password和
jdk/jre/lib/management/jmxremote.access中的认证和授权信息,jmxremote.password文件的只能对拥有者或超级用户开放读或写权限,否则报错Error: Password file read access must be restricted
指定认证文件
#认证用户名密码 -Dcom.sun.management.jmxremote.password.file=/opt/home/lichengwu/jvm/management/jmxremote.password #访问模式 -Dcom.sun.management.jmxremote.access.file=/opt/home/lichengwu/jvm/management/jmxremote.access
②SSL访问
方式二、适配过的RMI方式,比如HTTP
1、首先下载jmxtools.jar,内含HtmlAdaptorServer
2、将HtmlAdaptorServer一起注册为MBean来提供了HTTP远程访问方式。
MBeanServer server = ManagementFactory.getPlatformMBeanServer(); HtmlAdaptorServer http = new HtmlAdaptorServer(); server.registerMBean(http, new ObjectName("httpServer:name=HttpAdaptor")); AuthInfo auth = new AuthInfo("wcj10051891", "123456"); //添加用户认证 http.addUserAuthenticationInfo(auth); //监听端口 http.setPort(1234); http.start(); //浏览器访问http://ip:1234
方式三、编程方式访问
JMXServiceURL u = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://xxx.com:8888/jmxrmi"); Map<String, Object> env = new HashMap<>(); env.put(JMXConnector.CREDENTIALS, new String[]{"wcj", "123456"}); JMXConnector c = JMXConnectorFactory.connect(u, env); MBeanServerConnection connection = c.getMBeanServerConnection(); ObjectName name = new ObjectName("domainName:type=myStatistics,name=myStatistics"); System.out.println(connection.invoke(name, "toString", null, null)); c.close();