hengheng123456789

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
一、简介
 
  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”按钮来执行它。这时Eclipse的console视图
四、总结

  Notification和Java的事件模型是一样的,另外如果你买了《Eclipse从入门到精通》,你会发现第22.4节也使用了和Notification和Java的事件模型相同的设计方式。Notification在我们的实际项目中也用到了,象我们现在的给移动做的项目中(基于JMX实现),分散在各地方的工作站的日志,就是通过Notification方式,把每条产生的日志封装在 Notification中实时发回主控服务器的。有机会我会发这一系统的关于日志的设计方案写一下,它实现了对各地工作站的集中的、实时的监控,非常实用。
posted on 2006-08-28 09:30 哼哼 阅读(651) 评论(1)  编辑  收藏 所属分类: JMX

Feedback

# re: 3、Notification的使用 2016-08-02 17:17 袁良锭
通过Notification发日志到主工作站。
Notification也可以通过网络发送?  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: