- Notification 这个相当于一个信息包,封装了需要传递的信息
- Notification broadcaster 这相当于一个广播器,把消息广播出去
- Notification listerner 这是一个监听器,用于监听广播出来的Notification消息
- Notification filter 这是一个过滤器,过滤掉不需要的Notification消息
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/,出现如下界面。1133701664014_6541.jpg
2、 进入“name=jack”项,然后单击“hi”按钮来执行它。这时Eclipse的console视图显示如下:
1133702044916_7117.jpg
四、总结
Notification和Java的事件模型是一样的,另外如果你买了《Eclipse从入门到精通》,你会发现第22.4节也使用了和Notification和Java的事件模型相同的设计方式。Notification在我们的实际项目中也用到了,象我们现在的给移动做的项目中(基于JMX实现),分散在各地方的工作站的日志,就是通过Notification方式,把每条产生的日志封装在Notification中实时发回主控服务器的。有机会我会发这一系统的关于日志的设计方案写一下,它实现了对各地工作站的集中的、实时的监控,非常实用。
转载地址:http://www.blogjava.net/chengang/archive/2006/03/07/34083.html