JMX是管理和监控java项目

        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();

 

猜你喜欢

转载自wcj10051891.iteye.com/blog/1936811