JMX详解

接口定义:

public interface HelloMBean {
    public String getName();
    public void setName(String name);
    public void print();
}

实现接口:

public class Hello implements HelloMBean {
    private String name = "";
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void print() {
        System.out.println("Hello, " + name + "!!!");
    }
}

Server端

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.RMISocketFactory;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXAuthenticator;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXPrincipal;
import javax.management.remote.JMXServiceURL;
import javax.management.remote.rmi.RMIConnectorServer;
import javax.security.auth.Subject;
import com.sun.jdmk.comm.HtmlAdaptorServer;

public class JmxServer {
    private final AtomicBoolean runningFlag = new AtomicBoolean(true);

    public static void main(String[] args) throws Exception 
    {
        String ipString= "127.0.0.1";
        String port = "31999";
        //客户端需要用的认证信息
        String userName = "userName";
        String password = "passWord";
        //创建server
        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
        //ObjectName testMBeanName = new ObjectName("helloMBeanDomain:name=helloMBean");
        ObjectName testMBeanName = new ObjectName("helloMBeanDomain", "type", "HelloMBean");
        //创建对象
        HelloMBean mbean =  new Hello();
        //注册对象到mBeanServer
        mBeanServer.registerMBean(mbean, testMBeanName);
        //监听
        JMXConnectorServer jmxConnectorServer = createMBeanServerConnection(ipString, port, userName, password);
        jmxConnectorServer.start();
        // 启动HtmlAdaptorServer适配器,这样远程可以通过网页调用服务端程序:http://192.168.1.189:9999/ (server端ip:port)
        HtmlAdaptorServer adaptor = new HtmlAdaptorServer();
        ObjectName adaptorName = new ObjectName("jmxAdaptor:name=adaptor,port=5050");
        mBeanServer.registerMBean(adaptor, adaptorName);
        adaptor.setPort(9999);
        adaptor.start();
    }
    /**
     * 
     * @param ip server端ip
     * @param jmxport 端口号
     * @param userName 认证用的用户名
     * @param password 认证用的密码
     */
    public static JMXConnectorServer createMBeanServerConnection(String ip, String jmxport, String userName, String password) throws IOException 
    {
        String jmxURLString =  "service:jmx:rmi:///jndi/rmi://" + ip + ":"  + jmxport + "/jmxrmi";
        JMXServiceURL jmxURL = new JMXServiceURL(jmxURLString);
        Map<String, Object> jmxEnvironmen = new HashMap<String, Object>();
        //credentials n. 证书;文凭;
        jmxEnvironmen.put("jmx.remote.credentials", new String[]{userName, password});
        RMISocketFactory rmiFactory = RMISocketFactory.getDefaultSocketFactory();
        //Registry n. 注册;登记处;
        LocateRegistry.createRegistry(31999, null, rmiFactory);
        jmxEnvironmen.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, rmiFactory);
        // 需要认证则这么写:Authenticator n. 认证者;认证器
        JMXAuthenticator auth = createJMXAuthenticator();
        jmxEnvironmen.put(JMXConnectorServer.AUTHENTICATOR, auth);
        JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxURL , jmxEnvironmen, ManagementFactory.getPlatformMBeanServer());
        return jmxConnectorServer;
    }
    /**
     *  认证
     * @return
     */
    private static JMXAuthenticator createJMXAuthenticator() 
    {
        return new JMXAuthenticator() 
        {
            public Subject 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 ("userName".equals(userName) && "passWord".equals(pValue)) 
                {
                    Set<JMXPrincipal> principals = new HashSet<JMXPrincipal>();
                    principals.add(new JMXPrincipal(userName));
                    return new Subject(true, principals, Collections.EMPTY_SET, Collections.EMPTY_SET);
                }
                throw new SecurityException("Authentication failed!");
            }
        };
    }
}

client端

package jmx;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.management.Attribute;
import javax.management.JMX;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import jmx.os.property.IMonitorService;
import jmx.os.property.MonitorInfoBean;
import jmx.os.property.MonitorServiceImpl;

public class JmxClient {
    private static String rmiPort = "31999";
    private static String ip = "192.168.1.189"; //server端ip
    //private static String ip = "127.0.0.1";
    private static String userName = "userName";
    private static String passWord = "passWord";
    public static void main(String[] args) throws Exception 
    {
        //ObjectName.getInstance(String domain, String key, String value) 
        //返回 ObjectName 的实例,该 ObjectName 可用于任何使用 new ObjectName(domain, key, value) 获得的对象可以使用的地方。
        //ObjectName hello_name = new ObjectName("helloMBeanDomain", "type", "HelloMBean");
        ObjectName hello_mbeanName = new ObjectName("helloMBeanDomain:type=HelloMBean");
        JMXConnector jmxConnector = getJMXConnector(ip, rmiPort, userName, passWord);

//      MBeanServerConnection mbs = jmxConnector.getMBeanServerConnection();
//      ThreadMXBean threadBean = ManagementFactory.newPlatformMXBeanProxy(mbs, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);
//      System.out.println("getThreadCount " + threadBean.getThreadCount());//线程数

        MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();
        //print domains
        System.out.println("Domain:---------------------");
        String domains[] = mBeanServerConnection.getDomains();
        for(int i = 0; i < domains.length; i++) {
            System.out.println("\t Domain[" + i +"] = " + domains );
        }
        //MBean count
        System.out.println("MBean count = " + mBeanServerConnection.getMBeanCount());

        //process attribute  
        mBeanServerConnection.setAttribute(hello_mbeanName, new Attribute("Name", "new value"));//set value  
        System.out.println("Name = " + mBeanServerConnection.getAttribute(hello_mbeanName, "Name"));//get value  


       //invoke via proxy  
        HelloMBean proxy = (HelloMBean) MBeanServerInvocationHandler.newProxyInstance(mBeanServerConnection, hello_mbeanName, HelloMBean.class, false);          
        proxy.setName("albert");  
        proxy.print(); 
        //invoke via rmi
        mBeanServerConnection.invoke(hello_mbeanName, "print", null, null);

        //get mbean information
        MBeanInfo mBeanInfo = mBeanServerConnection.getMBeanInfo(hello_mbeanName);
        System.out.println("Hello Class: " + mBeanInfo.getClassName());
        for(int i = 0; i < mBeanInfo.getAttributes().length; i++) {
            System.out.println("Hello Attribute: " + mBeanInfo.getAttributes()[i].getName());
        }
        for(int i = 0; i < mBeanInfo.getOperations().length; i++) {
            System.out.println("Hello Operation: " + mBeanInfo.getOperations()[i].getName());
        }
        //ObjectName of MBean
        System.out.println("all ObjectName:--------------");
        Set set = mBeanServerConnection.queryMBeans(null, null);
        for(Iterator it = set.iterator(); it.hasNext();) {
            ObjectInstance objectInstance = (ObjectInstance) it.next();
            System.out.println("\t" + objectInstance.getObjectName());
        }

        HelloMBean helloMBean = JMX.newMXBeanProxy(mBeanServerConnection, hello_mbeanName, HelloMBean.class);
        //System.out.println("helloMBean:  " + helloMBean.toString());
        helloMBean.setName("firstName: wenhao");
        helloMBean.print();
        helloMBean.setName("LastName: wang");
        helloMBean.print();
        jmxConnector.close();
    }
    /**
     * 建立连接
     * @param ip 服务端ip
     * @param jmxport 服务端port
     * @param userName 认证用的用户名
     * @param password 认证用的密码
     */
    public static JMXConnector getJMXConnector(String ip, String jmxport, String userName, String password) throws IOException 
    {
        JMXServiceURL jmxURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + ip + ":"  + jmxport + "/jmxrmi");
        Map<String, Object> jmxEnvironment = new HashMap<String, Object>();
        // 如果服務端有认证,則客戶端也要这么写:
        jmxEnvironment.put("jmx.remote.credentials", new String[] {userName, password});
        JMXConnector connector = JMXConnectorFactory.connect(jmxURL, jmxEnvironment);
        return connector;
    }

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。
稍后我会写一篇关于JMX比较详细的文章。
参考链接:
JMX: http://blog.csdn.net/DryKillLogic/article/details/38412913
JMX:http://www.cnblogs.com/FlyAway2013/p/jmx.html
JMX:http://www.cnblogs.com/dongguacai/p/5900507.html
JMX:http://blog.csdn.net/u013256816/article/details/52800742
JMX:http://blog.csdn.net/chaofanwei2/article/details/51291118
RMI:http://www.blogjava.net/zhenyu33154/articles/320245.html
RMI:http://code727.iteye.com/blog/1874271
RMI:http://blog.csdn.net/ppyy11223344/article/details/52691290
RMI:http://blog.csdn.net/a19881029/article/details/9465663
RPC:http://www.cnblogs.com/flyoung2008/archive/2011/11/12/2246282.html
Netty:
http://www.infoq.com/cn/presentations/netty-architecture-analysis-and-industry-application?utm_source=infoq&utm_medium=videos_homepage&utm_campaign=videos_row3#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2751b6d1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值