[JMX一步步来] 3、Notification的使用

一、简介
   
Mbean之间的通信是必不可少的,Notification就起到了在Mbean之间沟通桥梁的作用。JMX notification 由四部分组成:
   
* Notification 这个相当于一个信息包,封装了需要传递的信息
   
* Notification broadcaster 这相当于一个广播器,把消息广播出去
   
* Notification listerner 这是一个监听器,用于监听广播出来的Notification消息
   
* Notification filter 这是一个过滤器,过滤掉不需要的Notification消息
   
Notification broadcaster不需要我们实现,JMX的内部已经有了。Notification filter一般也很少用。下面的例子主要用到了Notification、Notification listerner。

二、实例
   
在第一篇的Hello中有一个printHello(String whoName)方法,意思根据碰到的是谁来打招呼,比如:
    Jack从对面走过来,说:“hi”
    我们回之以礼,说:“Hello, jack”
   
先这需要Jack先说一个hi(相应一个操作方法),然后他说的话封装成声波(相当Notification消息包)传递 出去。然后我们还要给Jakc装上一个监听器(Hello的耳朵??^_^),这个监听器将捕捉到Jack的声波语音包,并进行相应处理,即说 “Hello, jack”。
   
好,我们看看如何实现的:

   
1、Jack类及其相应的MBean
      
我们把Jack写成一个MBean,如下:
import javax.management.Notification;   import javax.management.NotificationBroadcasterSupport;      public class Jack extends NotificationBroadcasterSupport implements JackMBean {       private int seq = 0;       public void hi() {           Notification n = new Notification(//创建一个信息包                   "jack.hi",//给这个Notification起个名称                   this//由谁发出的Notification                   ++seq,//一系列通知中的序列号,可以设任意数值                   System.currentTimeMillis(),//发出时间                   "Jack");//发出的消息文本           //发出去           sendNotification(n);       }   }  
说明:
   
* 必需继承NotificationBroadcasterSupport
   
* 此类只有一个hi方法,方法只有两句:创建一个Notification消息包,然后将包发出去
   
* 如果你还要在消息包上附加其他数据,Notification还有一个setUserData方法可供使用

   
2、接下来是他的MBean
public interface JackMBean {       public void hi();   }  
   
    3、创建一个Listener,监听到的Notification消息包将由此类负责处理。
 
import javax.management.Notification;   import javax.management.NotificationListener;   public class HelloListener implements NotificationListener {       public void handleNotification(Notification n, Object handback) {           System.out.println("type=" + n.getType());           System.out.println("source=" + n.getSource());           System.out.println("seq=" + n.getSequenceNumber());           System.out.println("send time=" + n.getTimeStamp());           System.out.println("message=" + n.getMessage());              if (handback != null) {               if (handback instanceof Hello) {                   Hello hello = (Hello) handback;                   hello.printHello(n.getMessage());               }           }       }   }  

    4、修改HelloAgent如下:
import javax.management.MBeanServer;   import javax.management.MBeanServerFactory;   import javax.management.ObjectName;   import com.sun.jdmk.comm.HtmlAdaptorServer;   public class HelloAgent {       public static void main(String args[]) throws Exception{           MBeanServer server = MBeanServerFactory.createMBeanServer();           ObjectName helloName = new ObjectName("chengang:name=HelloWorld");           Hello hello=new Hello();           server.registerMBean(hello, helloName);           ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");           HtmlAdaptorServer adapter = new HtmlAdaptorServer();           server.registerMBean(adapter, adapterName); 
        Jack jack = new Jack();           server.registerMBean(jack, new ObjectName("HelloAgent:name=jack"));           jack.addNotificationListener(new HelloListener(), null, hello);           adapter.start();           System.out.println("start.....");       }   }  

三、运行
   
1、先运行HelloAgent启动服务,再打开浏览器输入网址:http://localhost:8082/
   
2、进入“name=jack”项,然后单击“hi”按钮来执行它。

四、总结
   
Notification和Java的事件模型是一样的,另外如果你买了《Eclipse从入门到精通》,你会发现第 22.4节也使用了和Notification和Java的事件模型相同的设计方式。Notification在我们的实际项目中也用到了,象我们现在的 给移动做的项目中(基于JMX实现),分散在各地方的工作站的日志,就是通过Notification方式,把每条产生的日志封装在 Notification中实时发回主控服务器的。有机会我会发这一系统的关于日志的设计方案写一下,它实现了对各地工作站的集中的、实时的监控,非常实 用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值