JMX Connectors

JMX Connectors

JMX有两种connector:

1、  RMI Connector

2、  JMXMP Connector (JMX message protocol Connector)

 

RMI Connector支持RMI Transports , Java Remote Method Protocol (JRMP) Inter-Object Request Broker Protocol (IIOP)

 

下面的例子将利用 RMI Connector server client 之间建立连接

 

server的主要功能:

1、  建立 Mbean server

2、  建立 RMI connector server

 

Client 的主要功能:

1、  建立 RMI connector

2、  通过 RMI connector Mbean server 注册一个 Mbean

 

所包含的文件:

 Server.java

 SimpleStandardMBean.java

 SimpleStandard.java

 ClientListener.java

 Client.java

 

运行环境:

首先去sun下载两个压缩包:

1jmx-1_2_1-bin

2jmxremote-1_0_1-bin

以下程序需要这两个包里面的lib/*.jar

 

 

源程序:

Server.java

 

import javax.management.MBeanServer;

import javax.management.MBeanServerFactory;

import javax.management.remote.JMXConnectorServer;

import javax.management.remote.JMXConnectorServerFactory;

import javax.management.remote.JMXServiceURL;

 

public class Server {

 

    public static void main(String[] args) {

        try {

            // Instantiate the MBean server

            //

            System.out.println("/nCreate the MBean server");

            MBeanServer mbs = MBeanServerFactory.createMBeanServer();

 

            // Create an RMI connector server

            //

            System.out.println("/nCreate an RMI connector server");

            JMXServiceURL url = new JMXServiceURL(

              "service:jmx:rmi:///jndi/rmi://localhost:9999/server");

            JMXConnectorServer cs =

                JMXConnectorServerFactory.newJMXConnectorServer(

url,     //url

 null,     //environment map

mbs);    //MBeanServer

 

            // Start the RMI connector server

            //

            System.out.println("/nStart the RMI connector server");

            cs.start();

            System.out.println("/nRMI connector server successfully started");

            System.out.println("/nWaiting for incoming connections...");

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

 

为了便于观察Server的情况,可以在Server.java 加入 htmlAdapterServer 通过浏览器察看,具体情况为在 MBeanServer mbs = MBeanServerFactory.createMBeanServer();下面添加代码:可能这么说比较不清楚,直接把全部代码写出来吧,虽然比较多的代码让人看的不舒服了 : )

 

///更改后的Server.java

Server.java

/*

 * Created on 2004-12-25

 * @author roson

 */

 

 

import javax.management.*;

import javax.management.MBeanServerFactory;

import javax.management.remote.*;

 

import jmxInAction.Logger;

 

import com.sun.jdmk.comm.HtmlAdaptorServer;

 

public class Server {

 

    public static void main(String[] args) {

        try

        {

            System.out.println("Create the MBean server");

            MBeanServer mbs=MBeanServerFactory.createMBeanServer();

            System.out.println("/n/tCREATE, REGISTER and START a new HTML adaptor:");

            HtmlAdaptorServer html = new HtmlAdaptorServer();

           ObjectName html_name = null;

            try

{

            html_name = new ObjectName("Logger:name=html,port=8082");

            System.out.println("/tOBJECT NAME         = " + html_name);

            mbs.registerMBean(html, html_name);

            }

catch(Exception e)

{

            System.out.println("/t!!! Could not create the HTML adaptor !!!");

            e.printStackTrace();

            return;

           }

            html.start();       

            System.out.println("Create an RMI Connector server");

            JMXServiceURL url=new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");

//JMXServiceURL url=new JMXServiceURL("jmxmp",null,5555);

// jmxmprmi connector 不同的地方

            JMXConnectorServer cs=JMXConnectorServerFactory.newJMXConnectorServer(

                    url,           //url

                    null,          //environment map

                    mbs);          //MBeanServer

            cs.start();

        }

        catch(Exception e)

        {

            e.printStackTrace();

        }

    }

}

 

/^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 更改后的Server.java ^^^^^^^^^^^^^^^^^^^^^^^^^^

更改后就可以通过浏览器来察看Server的情况了。http://localhost:8082 为浏览器地址栏

 

SimpleStandardMBean.java

 

public interface SimpleStandardMBean {

public String getState();       //读状态State

public void setState(String s); //写状态State

public int getNbChanges();    //状态更改次数

public void reset();       //重至

}

 

 

SimpleStandard.java

 

import javax.management.*;

 

public class SimpleStandard extends NotificationBroadcasterSupport

                                                                 implements SimpleStandardMBean{

    private String state="initial state";

    private int nbChanges=0;

    private int nbResets=0;

   

 

  

   

    public String getState() {

        return state;

    }

  

    public void setState(String state) {

        this.state=state;

        nbChanges++;

    }

  

    public int getNbChanges() {

        return nbChanges;

    }

  

    public void reset() {

        AttributeChangeNotification acn=new AttributeChangeNotification(

this,         //source

0,                         //sequenceNumber

0,                         //timeStamp

                                                           "NbChanges reset",           //message

"NbChanges",                     //属性名

"Integer",                             //属性的类型

                                                           new Integer(nbChanges), //属性更改前的值

new Integer(0));        //属性更改后的值

 

        state="initial state";

        nbChanges=0;

        nbResets++;

        sendNotification(acn);

    }

  

}

 

 

ClientListener.java

 

import javax.management.*;

 

public class ClientListener implements NotificationListener{

    public void handleNotification(Notification notification, Object handback) {

        System.out.println("/nReceived notification:"+notification);

    }

}

 

 

Client.java

 

import javax.management.Attribute;

import javax.management.MBeanServerConnection;

import javax.management.MBeanServerInvocationHandler;

import javax.management.ObjectName;

import javax.management.remote.JMXConnector;

import javax.management.remote.JMXConnectorFactory;

import javax.management.remote.JMXServiceURL;

 

public class Client {

 

    public static void main(String[] args) {

        try {

            // Create an RMI connector client and

            // connect it to the RMI connector server

            //

            System.out.println("/nCreate an RMI connector client and " +

                               "connect it to the RMI connector server");

            JMXServiceURL url = new JMXServiceURL(

              "service:jmx:rmi:///jndi/rmi://localhost:9999/server");

//JMXServiceURL url=new JMXServiceURL("jmxmp",null,5555);

//jmxmp connector rmi connector不同的地方,此时jmxp connector的端口号为5555

            JMXConnector jmxc = JMXConnectorFactory.connect(url, null);

 

            // Get an MBeanServerConnection

            //

            System.out.println("/nGet an MBeanServerConnection");

            MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

 

            // Get domains from MBeanServer

            //

            System.out.println("/nDomains:");

            String domains[] = mbsc.getDomains();

            for (int i = 0; i < domains.length; i++) {

                System.out.println("/tDomain[" + i + "] = " + domains[i]);

            }

 

            // Create SimpleStandard Mbean 注册了个Mbean

            //

            ObjectName mbeanName = new ObjectName("MBeans:type=SimpleStandard");

            System.out.println("/nCreate SimpleStandard MBean...");

            mbsc.createMBean("SimpleStandard", mbeanName, null, null);

 

            // Get MBean count

            //

            System.out.println("/nMBean count = " + mbsc.getMBeanCount());

 

            // Get State attribute

            //

            System.out.println("/nState = " +

                               mbsc.getAttribute(mbeanName, "State"));

 

            // Set State attribute

            //

            mbsc.setAttribute(mbeanName,

                              new Attribute("State", "changed state"));

 

            // Get State attribute

        //

        // Another way of interacting with a given MBean is through a

        // dedicated proxy instead of going directly through the MBean

        // server connection

        //

        SimpleStandardMBean proxy = (SimpleStandardMBean)

        MBeanServerInvocationHandler.newProxyInstance(

                         mbsc,

                         mbeanName,

                         SimpleStandardMBean.class,

                         false);

            System.out.println("/nState = " + proxy.getState());

 

            // Add notification listener on SimpleStandard MBean

            //

            ClientListener listener = new ClientListener();

            System.out.println("/nAdd notification listener...");

            mbsc.addNotificationListener(mbeanName, listener, null, null);

 

            // Invoke "reset" in SimpleStandard MBean

            //

            // Calling "reset" makes the SimpleStandard MBean emit a

            // notification that will be received by the registered

            // ClientListener.

            //

            System.out.println("/nInvoke reset() in SimpleStandard MBean...");

            mbsc.invoke(mbeanName, "reset", null, null);

 

            // Sleep for 2 seconds in order to have time to receive the

            // notification before removing the notification listener.

            //

            System.out.println("/nWaiting for notification...");

            Thread.sleep(2000);

 

            // Remove notification listener on SimpleStandard MBean

            //

            System.out.println("/nRemove notification listener...");

            mbsc.removeNotificationListener(mbeanName, listener);

 

            // Unregister SimpleStandard MBean

            //

            System.out.println("/nUnregister SimpleStandard MBean...");

            mbsc.unregisterMBean(mbeanName);

 

            // Close MBeanServer connection

            //

            System.out.println("/nClose the connection to the server");

            jmxc.close();

            System.out.println("/nBye! Bye!");

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

client中注册了个Mbean 这个在命令行是看不到它所在的域名,因为是先连接Server,查看Server所有的域名,接着再注册的。不过,可以在浏览器中看到情况的变化。刷新下试试 : )

 

运行程序:

1、  运行环境 中提到的几个 jar 包放在classpath ,(我是用eclipse 来做的,觉得很方便)

2、  编译。

如果是RMI Connector 就要用 rmiregister : 在命令提示行输入:rmiregistry 9999

Jmxmp 就不需要了。

3、  运行 Server.java ,接着运行 Client.java

 

 

摘自 jmxremote-1_0_1-bin/doc/tutorial

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值