java jmx 例子_jmx完整示例

很早就开始去了解这个了,不过一直都是皮毛,基本概念明白,具体api几乎一无不知。。。

认真看了几篇文章,做了测试,终于有所了解

写得最好的:http://www.cnblogs.com/yaohonv/archive/2012/02/08/jmx.html, 图也很清楚,不过初入门的时候看起来比较吃力, 其中对jmx-rmi有所涉及,不错,可惜实验不通。没地方下载jmxremoting.jar

个人理解:

关于mbean:

standard MBean,这种类型的MBean最简单: 一个接口,一个实现类即可,不需要任何其他类依赖,但是命名必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。

假如某个属性只有get方法,则说明这个属性是只读的,get/set都有的话,说明这个属性是可读可写的

DynamicMBean 可以动态拓展需要管控的资源,即允许bean里面的属性、方法可变,因此需要实现额外的方法:

package javax.management; public interface DynamicMBean{     public Object getAttribute( String attribute )throws AttributeNotFoundException, MBeanException,ReflectionException;

public void setAttribute( Attribute attribute )throws AttributeNotFoundException,InvalidAttributeValueException,MBeanException,ReflectionException;

public AttributeList getAttributes( String[] attributes );

public AttributeList setAttributes( AttributeList attributes );

public Object invoke( String actionName, Object[] params,String[] signature ) throws MBeanException,ReflectionExceptionn

public MBeanInfo getMBeanInfo(); }

openMBean及其他一些未规范的就不说了

关于jmx客户端都jmx服务端的访问:

1 通过浏览器,jmx client程序启用http协议,这个时候需要一个HTMLAdapter

3 程序访问?

a 通过JMXConnector

b 通过http协议,HTMLAdapter?

一些重要的接口:

ManagementFactory 专门生产MBeanServer

MBeanServer  一般就是MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

这个很重要,主要就是通过它来管理mbean的,主要方法有:registerMBean,unRegisterMBean,addNotificationListenerremoveNotificationListener

createMBean/queryMBean

get/setAttributes

instantiate 不知道干什么的。。。

JMXServiceURL 创建ConnectorServer需要用到,

RMIConnectorServer  -> ConnectorServer

JMXConnector

待续。。

=========================================== 20140215 =========================================================

今天终于搞定!!

一个完整的例子贴上!!!:

packagejmx;public interfaceHelloMBean {//management attributes

publicString getName();public voidsetName(String name);//management operations

public voidprint();

}

packagejmx;public class Hello implementsHelloMBean {private String name = "";publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public voidprint() {

System.out.println("Hello, " + name + "!!");

}

}

packagejmx;importjava.lang.management.ManagementFactory;importjava.net.InetAddress;importjava.rmi.registry.LocateRegistry;importjava.rmi.server.RMISocketFactory;importjava.util.Collections;importjava.util.HashMap;importjava.util.HashSet;importjava.util.Map;importjava.util.Set;importjava.util.concurrent.atomic.AtomicBoolean;importjavax.management.MBeanServer;importjavax.management.ObjectName;importjavax.management.remote.JMXAuthenticator;importjavax.management.remote.JMXConnectorServer;importjavax.management.remote.JMXConnectorServerFactory;importjavax.management.remote.JMXPrincipal;importjavax.management.remote.JMXServiceURL;importjavax.management.remote.rmi.RMIConnectorServer;importjavax.security.auth.Subject;public classJmxServer {private final AtomicBoolean runningFlag = new AtomicBoolean(true);/***@paramargs

*@throwsInterruptedException*/

public static void main(String[] args) throwsInterruptedException {try{

MBeanServer mbs=ManagementFactory.getPlatformMBeanServer();

String addr= "10.74.169.50:31999";//本机的话ip地址可以使用localhost或者127.0.0.1

JMXServiceURL address= new JMXServiceURL("service:jmx:rmi://"

+ addr + "/jndi/rmi://" + addr + "/jmxrmi");

Map jmxEnvironment = new HashMap();

jmxEnvironment.put("jmx.remote.credentials", new String[] { "saf","asswrd"});

InetAddress ipInterface= InetAddress.getByName("10.74.169.50");

RMISocketFactory rmiFactory=RMISocketFactory.getDefaultSocketFactory();//new AnchorSocketFactory(ipInterface,"false");

LocateRegistry.createRegistry(31999, null, rmiFactory);//這個是必須的,否則報 no such object in table之類是異常!!!! 花了相當長時間才發現這點

jmxEnvironment.put(

RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE,

rmiFactory);//需要认证则这么写://JMXAuthenticator auth = createJMXAuthenticator();//jmxEnvironment.put(JMXConnectorServer.AUTHENTICATOR, auth);

JMXConnectorServer connector=JMXConnectorServerFactory

.newJMXConnectorServer(address, jmxEnvironment,

ManagementFactory.getPlatformMBeanServer());

HelloMBean mbean= newHello();

ObjectName testMBeanName= newObjectName("helloMBean:name=helloMBean");

testMBeanName= new ObjectName("helloMBeanDomain", "type","HelloMBean");

mbs.registerMBean(mbean, testMBeanName);

connector.start();

}catch(Exception e) {

e.printStackTrace();

}//try {//这个好像没用//synchronized (this) {//while (runningFlag.get()) {//this.wait();//}//}//} catch (Exception e) {//

//}

}privateJMXAuthenticator createJMXAuthenticator() {return newJMXAuthenticator() {publicSubject authenticate(Object credentials) {

String[] sCredentials=(String[]) credentials;if (null == sCredentials || sCredentials.length != 2) {throw new SecurityException("Authentication failed!");

}

String userName= sCredentials[0];

String pValue= sCredentials[1];if ("saf".equals(userName) && "asswrd".equals(pValue)) {

Set principals= newHashSet();

principals.add(newJMXPrincipal(userName));return new Subject(true, principals, Collections.EMPTY_SET,

Collections.EMPTY_SET);

}throw new SecurityException("Authentication failed!");

}

};

}

}

packagejmx;importjava.lang.management.ManagementFactory;importjava.lang.management.ThreadMXBean;importjava.util.HashMap;importjava.util.Map;importjavax.management.JMX;importjavax.management.MBeanServerConnection;importjavax.management.ObjectName;importjavax.management.remote.JMXConnector;importjavax.management.remote.JMXConnectorFactory;importjavax.management.remote.JMXServiceURL;public classJmxClient {/***@paramargs

*@throwsInterruptedException*/

public static void main(String[] args) throwsInterruptedException {

ObjectName hello_name= null;try{

hello_name= new ObjectName("helloMBeanDomain", "type","HelloMBean");

System.out.println("\tOBJECT NAME = " +hello_name);//service:jmx:rmi://%s:%d/jndi/rmi://%s:%d/jmxrmi

String addr = "10.74.169.50:31999";

JMXServiceURL address= new JMXServiceURL("service:jmx:rmi://"

+ addr + "/jndi/rmi://" + addr + "/jmxrmi");

System.out.println("JmxRemote.main()1");

Map jmxEnvironment = new HashMap();//如果服務端有认证,則客戶端也要这么写://jmxEnvironment.put("jmx.remote.credentials", new String[] {//"saf", "asswrd"});

JMXConnector connector=JMXConnectorFactory.connect(address,

jmxEnvironment);

System.out.println("JmxRemote.main()2");

MBeanServerConnection mbs=connector.getMBeanServerConnection();

System.out.println("JmxRemote.main()3");

ThreadMXBean threadBean=ManagementFactory.newPlatformMXBeanProxy(

mbs, ManagementFactory.THREAD_MXBEAN_NAME,

ThreadMXBean.class);

System.out

.println(" getThreadCount " + threadBean.getThreadCount());//线程数量

MBeanServerConnection connection=connector

.getMBeanServerConnection();

HelloMBean helloMBean=JMX.newMXBeanProxy(connection, hello_name,

HelloMBean.class);

System.out.println("aaaaaaaa " +helloMBean);

helloMBean.setName("LKKKKKKK ddd basdf");

helloMBean.print();

connector.close();

}catch(Exception e) {

e.printStackTrace();return;

}

}

}

packagejmx;importjava.io.IOException;importjava.net.InetAddress;importjava.net.ServerSocket;importjava.net.Socket;importjava.rmi.server.RMISocketFactory;importjavax.net.ssl.SSLServerSocket;importjavax.net.ssl.SSLServerSocketFactory;importjavax.net.ssl.SSLSocketFactory;public class AnchorSocketFactory extendsRMISocketFactory {private InetAddress ipInterface = null;privateString sslEnabled;publicAnchorSocketFactory() {

}publicAnchorSocketFactory(InetAddress ipInterface, String sslEnabled) {this.ipInterface =ipInterface;this.sslEnabled =sslEnabled;

}public ServerSocket createServerSocket(int port) throwsIOException {if (this.sslEnabled.equalsIgnoreCase("true")) {

SSLServerSocket sslserversocket= null;try{

SSLServerSocketFactory sslserversocketfactory=(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();

sslserversocket=(SSLServerSocket)sslserversocketfactory.createServerSocket(port,50,this.ipInterface);

}catch(IOException e) {throwe;

}returnsslserversocket;

}else{

ServerSocket serverSocket= null;try{

serverSocket= new ServerSocket(port, 50, ipInterface);

}catch(IOException e) {throwe;

}returnserverSocket;

}

}public Socket createSocket(String dummy, int port) throwsIOException {if (this.sslEnabled.equalsIgnoreCase("true")) {returnSSLSocketFactory.getDefault()

.createSocket(this.ipInterface.getHostName(), port);

}else{return newSocket(ipInterface, port);

}

}

}

如果是通过jconsole连接的就这么来:

e9eaac88e9ca69e9b89bae44a0c5cd8d.png

NOTE1:

server端步骤:

1 创建MBeanServerFactory mbs = ManagementFactory.getPlatformMBeanServer();

或者MBeanServerFactory mbs = MBeanServerFactory.createMBeanServer("HelloAgentaa"); //  这个域名要和下面的保持一致

2 设置jmxEnvMap,必须的有RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE,可选的有账号密码、ssl参数等

3 创建JMXServiceURL,支持多种协议,http/snmp/rmi 等,有一定的格式,rmi的格式是:service:jmx:rmi://%s:%d/jndi/rmi://%s:%d/jmxrmi

4 获取JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, jmxEnvMap, mbs);

5 创建ObjectName helloWorldName = new ObjectName("HelloAgentaa:type=hwa");

6 注册MBean  mbs.registerMBean(hw, helloWorldName);

7 启动connectorServer   connectorServer.start();

client端步骤:

1 同上2  如server端有设置账号密码、ssl参数等,client端需要一致

2 同上3

3 获取JMXConnector connector = JMXConnectorFactory.connect(address, jmxEnvironment);  需要注意的是,这里我们使用的是JMXConnector,而非JMXConnectorServer!

4 创建MBeanServerConnection connection = connector.getMBeanServerConnection();

这里很关键的是,我们需要一个MBeanServerConnection, 而不再是JMXConnectorServer! 因为这个client端。。

5 同上5

6 获取MBean: HelloWorldMBean helloMBean = JMX.newMXBeanProxy(connection, hello_name, HelloWorldMBean.class);

这里很关键的是,newMXBeanProxy的第三个参数和返回结果都是MBean接口,否则报错

7 尽情使用MBean,嘎嘎嘎!

8 使用后关闭MBeanServerConnection

NOTE2

ObjectName有三种构造函数:

helloWorldName = new ObjectName("HelloAgentaa", "type", "hwa");

helloWorldName = new ObjectName("HelloAgentaa:type=hwa");

Hashtable sadf = new Hashtable(); sadf.put("type", "hwa");helloWorldName = new ObjectName("HelloAgentaa",sadf );

上面三种形式等价,但是不能,helloWorldName = new ObjectName("HelloAgentaa:type=hwa", key, value); 或者new ObjectName("HelloAgentaa:type=hwa", map); 这样混合使用!

NOTE3

创建MBeanServerFactory有两种方式:

1 MBeanServerFactorymbs = ManagementFactory.getPlatformMBeanServer(); //  获取jmx平台基础已有的MBeanServerFactory

2 或者MBeanServerFactory mbs = MBeanServerFactory.createMBeanServer("HelloAgentaa"); // 获取新的MBeanServerFactory

具体使用哪种要酌情考虑

(clien不t需要MBeanServerFactory)

NOTE4

客户端使用完记得关闭JMXConnector

我这里没有设置jmx账号,所以下面两栏为空

如果需要使用ssl通道加密数据的话,则需执行(当然,要jmx服务器配置好ssl先):

jconsole -J-Djavax.net.ssl.trustStore=D:\jmx\certificate\serverTrustStore -J-Djavax.net.ssl.trustStorePassword=asswor

然后再在弹出的jconsole页面——远程连接——输入ip/port/username/password。。。。。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值