MBean之间的通信是必不可少的,Notification就起到了在MBean之间沟通桥梁的作用,JMX Notification由4个部分组成:
Notification 这个相当于一个信息包,封装了需要传递的信息。
Notification broadcast 这相当于一个广播器,把消息广播出去。
Notification listerner 这是一个监听器,用于监听广播出来的Notification 消息。
Notification filter 这是一个过滤器,过滤掉不需要的Notification 消息。
Notification broadcast不需要我们实现,JMX内部已经有了,Notification filter 一般也很少用,下面的例子主要用到
Notification 、Notification listerner。
1.目录结构
在hello中有一个sayHello(String message)方法,意思是根据碰到的是谁来打招呼,比如:
jack从对面走过来,说:‘hi’
我们回礼,说:‘hello jack“
首先需要jack先说一个hi(相应一个操作),然后他说的话封装成声波(相当于Notification 消息包)传递出去,然后我们还要给jack装上一个监听器(耳朵),这个监听器将捕捉到jack的声波语音包,并进行相应的处理,即说”hello jack“。
2.将jack写成一个MBean
JackMBean
package jmx.notification; public interface JackMBean { public void hi(); }
Jack
package jmx.notification; import javax.management.Notification; import javax.management.NotificationBroadcasterSupport; /** * Jack必须继承NotificationBroadcasterSupport * 此类只有一个hi方法,方法只有两句:创建消息报,然后将包发出去 * 如果你还要在消息包上附加其他数据,notification还有一个setUserData()方法 * @author chenyw * */ public class Jack extends NotificationBroadcasterSupport implements JackMBean{ private int seq =0; @Override public void hi() { Notification n = new Notification(//创建一个信息包 "jack.hi",//给这个Notifiction起一个名字 this,//由谁发出的Notification ++seq,//一系列通知中的序列号,可以设置任意数 System.currentTimeMillis(),//发出时间 "Jack"//发出文本 ); sendNotification(n); } }
3.创建一个Listerner,监听到的Notification 消息包将由此类负责处理。
HelloListener
package jmx.notification; import javax.management.Notification; import javax.management.NotificationListener; /** * 创建一个Listener,监听到的Notification消息包将由此类负责处理 * @author chenyw * */ public class HelloListener implements NotificationListener{ @Override 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 h = (Hello)handback; h.sayHello(n.getMessage()); } } } }
4.修改HelloAgent
package jmx.notification; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; import javax.management.ObjectName; import com.sun.jdmk.comm.HtmlAdaptorServer; /** * *该类是一个Agent类,说明: 先创建了一个MBeanServer,用来做MBean的容器 * 将Hello这个类注入到MBeanServer中,注入需要创建一个ObjectName类 * 创建一个AdaptorServer,这个类将决定MBean的管理界面,这里用最普通的Html型界面。 AdaptorServer其实也是一个MBean。 * jmx.hello:name=Hello的名字是有一定规则的,格式为:“域名:name=MBean名称”, * 域名和MBean名称都可以任意取。 打开网页:http://localhost:8082/ * */ public class HelloAgent { public static void main(String[] args) throws Exception { // 创建一个MBeanServer,用来做MBean的容器 MBeanServer mbs = MBeanServerFactory.createMBeanServer(); // 将Hello这个类注入到MBeanServer中,注入需要创建一个ObjectName类 ObjectName helloAdaptor = new ObjectName( "jmx.hello:name=Hello"); Hello hello = new Hello(); mbs.registerMBean(hello, helloAdaptor); ObjectName htmlAdaptorON = new ObjectName( "jmx.agent:name=HelloAgent,port=8082"); // 创建一个AdaptorServer,这个类将决定MBean的管理界面,这里用最普通的Html型界面 HtmlAdaptorServer htmlAdaptor = new HtmlAdaptorServer(); mbs.registerMBean(htmlAdaptor, htmlAdaptorON); //加入Notification Jack jack = new Jack(); mbs.registerMBean(jack, new ObjectName( "jmx.jack:name=Jack")); jack.addNotificationListener(new HelloListener(), null, hello); System.out.println("Starting the HtmlAdaptor...."); htmlAdaptor.start(); } }
5.运行HelloAgent,打开浏览器http://localhost:8082
进入那么=jack,然后点击hi按钮来执行它,这是控制台显示: