[转载]【JMX】2. JMX通知模型:Notification

转载声明:http://blog.csdn.net/vking_wang/article/details/8700967

复习

JMX构架中的各层及相关的组件

  1. 工具层(Instrumentation Level)
        (a) MBeans(标准的,动态的,开放的和模型MBeans)
        (b) 通知模型:Notification、NotificationListener等类
        (c) MBean元数据类:Attribute、Opreator等类
  2. 代理层(Agent Level)
        (a) MBean Server
        (b) 代理服务。如前一篇的HtmlAdaptorServer等。

 

Mbean之间的通信是必不可少的,Notification就起到了在Mbean之间沟通桥梁的作用。JMX notification 由四部分组成:

  • Notification 这个相当于一个信息包,封装了需要传递的信息
  • Notification broadcaster 这相当于一个广播器,把消息广播出——不需要我们实现,JMX的内部已经有了。
  • Notification listerner 这是一个监听器,用于监听广播出来的Notification消息
  • Notification filter 这是一个过滤器,过滤掉不需要的Notification消息——一般也很少用
实际上Notification和Java的事件模型是一样的。

 

接着上一篇的例子,Hello中有一个printHello(String whoName)方法,意思根据碰到的是谁来打招呼,比如:

     Jack从对面走过来,说:“hi”
  我们回之以礼,说:“Hello, jack”
 
  首先这需要Jack先说一个hi(相应一个操作方法),然后他说的话封装成声波(相当Notification消息包)传递出去。
   然后我们还要给Jakc装上一个监听器(Hello的耳朵??^_^),这个监听器将捕捉到Jack的声波语音包,并进行相应处理,即说“Hello, jack”。

1)再创建一个MBean

 

  1. public class Jack extends NotificationBroadcasterSupport implements JackMBean {     
  2.     private int seq = 0;         
  3.     @Override  
  4.     public void hi() {            
  5.             Notification n = new Notification(//创建一个信息包     
  6.                     "jack.hi",//给这个Notification起个名称      
  7.                     this//由谁发出的Notification      
  8.                     ++seq,//一系列通知中的序列号,可以设任意数值       
  9.                     System.currentTimeMillis(),//发出时间      
  10.                     "Jack-notif-msg");//发出的消息文本             
  11.             //发出去            
  12.             sendNotification(n);         
  13.     }     
  14. }  

 

 

  1. public interface JackMBean {         
  2.     public void hi();     
  3. }   

 

 

  • 必需继承NotificationBroadcasterSupport
  • 此类只有一个hi方法,方法只有两句:创建一个Notification消息包,然后将包发出去
  • 如果你还要在消息包上附加其他数据,Notification还有一个setUserData(Object o)方法可供使用

2)创建Notification Listener

 

监听到的Notification消息包将由此类负责处理

  1. public class HelloListener implements NotificationListener {      
  2.     @Override  
  3.     public void handleNotification(Notification n, Object handback) {     
  4.           
  5.         System.out.println("type=" + n.getType());           
  6.         System.out.println("source=" + n.getSource());        
  7.         System.out.println("seq=" + n.getSequenceNumber());       
  8.         System.out.println("send time=" + n.getTimeStamp());       
  9.         System.out.println("message=" + n.getMessage());     
  10.           
  11.         if (handback != null) {                
  12.             if (handback instanceof Hello) {           
  13.                 Hello hello = (Hello) handback;        
  14.                 hello.printHello(n.getMessage());       
  15.             }          
  16.         }        
  17.     }  
  18. }  

 

3)创建Agent

  1. public class HelloAgent {        
  2.     public static void main(String args[]) throws Exception{        
  3.           
  4.         MBeanServer server = MBeanServerFactory.createMBeanServer();         
  5.         ObjectName helloName = new ObjectName("alpha:name=HelloWorld");      
  6.         Hello hello=new Hello();            
  7.         server.registerMBean(hello, helloName);         
  8.         ObjectName adapterName = new ObjectName(  
  9.                             "HelloAgent:name=htmladapter,port=8082");        
  10.         HtmlAdaptorServer adapter = new HtmlAdaptorServer();         
  11.         server.registerMBean(adapter, adapterName);    
  12.           
  13.         Jack jack = new Jack();    //重点     
  14.         server.registerMBean(jack, new ObjectName("HelloAgent:name=jack"));    //重点     
  15.         jack.addNotificationListener(new HelloListener(), null, hello);    //重点     
  16.         adapter.start();             
  17.         System.out.println("start.....");       
  18.     }  
  19. }    

4)运行

 

先运行HelloAgent启动服务,再打开浏览器输入网址:http://localhost:8082/

进入“name=jack”项,然后单击“hi”按钮来执行它。 



控制台打印如下:

 

 

    1. start.....  
    2. type=jack.hi  
    3. source=jmx.notification.Jack@7526e85f  
    4. seq=1  
    5. send time=1363846170375  
    6. message=Jack-notif-msg  
    7. Hello , Jack-notif-msg  
posted @ 2014-02-09 22:59  leno.lix  阅读(279)  评论(0编辑  收藏  举报