JMX代码入门(二)

  1. package com.fanshadoop;
  2. import javax.management.Notification;
  3. import javax.management.NotificationBroadcasterSupport;
  4. /**
  5.  * JMX notification是用来从MBean和agent发送信息到其他对象(已经注册接受信息)的Java对象。
  6.  * 对接收事件感兴趣的是notification的监听者,他们实现javax.management.NotificationListener接口。
  7.    JMX事件可以是任何事情:从MBean属性变更到MBean Server上新的MBean注册。
  8.  *
  9.  *JMX支持两中机制:实现接口javax.management.NotificationBroadcaster
  10.  *                继承javax.management.NotificationBroadcasterSupport
  11.  *NotificationBroadcasterSupport给MBean提供了方法允许其他对象注册作为Notification的监听者
  12.  */
  13. public class HelloWorldNotification extends NotificationBroadcasterSupport
  14.         implements HelloWorldMBean {
  15.     private String greeting;
  16.     public HelloWorldNotification() {
  17.         this.greeting = “Hello World! I am a Standard MBean”;
  18.     }
  19.     public HelloWorldNotification(String greeting) {
  20.         this.greeting = greeting;
  21.     }
  22.     @Override
  23.     public void setGreeting(String greeting) {
  24.         this.greeting = greeting;
  25.         /*
  26.          * Notification构造器参数
  27.          * type:”.”分割的值,标识notification
  28.          * source:生成notification的MBean
  29.          * sequenceNumber:notification的序列号
  30.          * timestamp:时间戳
  31.          * message:消息
  32.          */
  33.         Notification notification = new Notification(
  34.                 “jmxbook.ch2.helloWorld.test”, this, -1,
  35.                 System.currentTimeMillis(), greeting);
  36.         /*
  37.          * sendNotification()是的NotificationBroadcasterSupport的方法,
  38.          * 将notification发送所有监听者
  39.          */
  40.         sendNotification(notification);
  41.     }
  42.     @Override
  43.     public String getGreeting() {
  44.         return greeting;
  45.     }
  46.     @Override
  47.     public void printGreeting() {
  48.         System.out.println( greeting );
  49.     }
  50. }

 

[java][/java] view plaincopyprint?

  1. public interface NotificationBroadcaster
  2. {
  3.    public void addNotificationListener(
  4.        NotificationListener listener,
  5.        NotificationFilter filter,
  6.        Object handback )throws IllegalArgumentException;
  7.    public MBeanNotificationInfo[] getNotificationInfo();
  8.    public void removeNotificationListener(
  9.       NotificationListener listener )
  10.       throws ListenerNotFoundException;
  11. }

NotificationBroadcasterSupport类实现了NotificationBroadcaster接口,MBean实现此接口,提供给其他对象注册监听器的机制,主要通过addNotificationListener()方法。
NotificationFilter参数是可选的,它允许MBean过滤哪些notification发送到监听器。

 

 

[java][/java] view plaincopyprint?

  1. package com.fanshadoop.notification;
  2. import javax.management.MBeanServer;
  3. import javax.management.MBeanServerFactory;
  4. import javax.management.Notification;
  5. import javax.management.NotificationListener;
  6. import javax.management.ObjectName;
  7. import com.sun.jdmk.comm.HtmlAdaptorServer;
  8. public class HelloAgentWithListener implements NotificationListener {
  9.     @Override
  10.     public void handleNotification(Notification notification, Object handback) {
  11.         System.out.println( “Receiving notification…” );
  12.         System.out.println( notification.getType() );
  13.         System.out.println( notification.getMessage() );
  14.     }
  15.     private MBeanServer mbs = null;
  16.     public HelloAgentWithListener() {
  17.         /*
  18.          * MBean server是一个用来包含和管理JMX MBean的Java对象,
  19.          * MBean server是一个标准的JMX类,它是JMX agents的核心。
  20.          * MBeanServerFactory可以管理多个MBeanSever实例
  21.          * 这里createMBeanServer方法的参数为一组MBean的domain,domain唯一区分其他的MBean server
  22.          * 如果HelloAgent已经存在,则会已经创建的MBeansever
  23.          */
  24.         mbs = MBeanServerFactory.createMBeanServer(“HelloAgent”);
  25.         /*
  26.          *agent通过构造协议适配器和连接器,向管理application开放MBean
  27.          */
  28.         HtmlAdaptorServer adapter = new HtmlAdaptorServer();
  29.         HelloWorld hw = new HelloWorld();
  30.         /*
  31.          * 在MBean上注册监听器
  32.          */
  33.         hw.addNotificationListener(this, null, null);
  34.         /*
  35.          * ObjectName类为MBean提供了一个命名空间,它由两部分组成
  36.          * 1)domain name(与MBean server的domain一致)
  37.          * 2)key=value属性列表,用来标识MBean,为MBean提供信息
  38.          * 可以提供诸如name,port,location和purpose等属性,属性以逗号分割,且key=value属性列表是唯一的
  39.          */
  40.         ObjectName adapterName = null;
  41.         ObjectName helloWorldName = null;
  42.         try {
  43.             helloWorldName = new ObjectName(“HelloAgent:name=helloWorld”);
  44.             mbs.registerMBean(hw, helloWorldName);
  45.             adapterName = new ObjectName(
  46.                     “HelloAgent:name=htmladapter,port=9092”);
  47.              adapter.setPort( 9092 );
  48.              mbs.registerMBean( adapter, adapterName );
  49.              adapter.start();
  50.         } catch (Exception e) {
  51.             e.printStackTrace();
  52.         }
  53.     }
  54.     public static void main(String args[]) {
  55.         System.out.println(“HelloAgent is running”);
  56.         HelloAgentWithListener agent = new HelloAgentWithListener();
  57.     }
  58. }

标签