JMX之Notification

来源:互联网 发布:华珍养血荣发颗粒淘宝 编辑:程序博客网 时间:2024/05/17 21:39
Notification起到了Mbean之间沟通桥梁的作用。JMX notification model 和 java event model 类似,将一些重要的信息,状态的转变,数据的变更传递给 notification listener。以使资源更容易管理。我想象中的Notification使用的场景是:一个服务器的MBean配置做更改了之后,可以通过Notification通知其他所有分布式的服务器也一同做更改。

JMX notification 由四部分组成:
1、  Notification
2、  Notification broadcaster
3、  Notification listerner
4、  Notification filter

下面的例子展示了两个MBean之间的通信:当执行SayHelloMBean的方法后,将一些状态信息传递到HelloMBean中,并且执行HelloMBean的相应的方法。

先创建HelloMBean、SayHelloMBean及其实现

package com.jmx.notification.demo;public interface HelloMBean {public String getName();public void setName(String name);public void helloWorld();public void helloWorld(String name);public String getTelephone();}

package com.jmx.notification.demo;public class Hello implements HelloMBean {private String name;private String telephone ="1351201201";@Overridepublic String getName() {return name;}@Overridepublic void helloWorld() {System.out.println("print......"+name);}@Overridepublic void helloWorld(String name) {System.out.println("print......."+name);}@Overridepublic void setName(String name) {this.name = name;System.out.println("My value is set to "+name);}@Overridepublic String getTelephone() {return telephone;}}

package com.jmx.notification.demo;public interface SayHelloMBean {public void hello();}


SayHello在执行完自己的方法实现后,调用了Notification,传递了一个通知
package com.jmx.notification.demo;import javax.management.Notification;import javax.management.NotificationBroadcasterSupport;public class SayHello extends NotificationBroadcasterSupport implementsSayHelloMBean {private int seq = 0;@Overridepublic void hello() {System.out.println("SayHello===========hello============");//create a notification(packet)Notification notification = new Notification("sayhello",// notification namethis,//who send++seq,//sequence numberSystem.currentTimeMillis(),//send time"Hello everybody.");//message content//sendsendNotification(notification);}}

创建NotificationListener,决定了其他MBean拿到SayHello传递的Notification后需要做什么

package com.jmx.notification.demo;import javax.management.Notification;import javax.management.NotificationListener;public class SayHelloListener implements NotificationListener {@Overridepublic void handleNotification(Notification notification, Object mbean) {//execute this method when listener receive notificationSystem.out.println("Type=" + notification.getType()+ ";\nSource=" + notification.getSource()+ ";\nSequenceNumber=" + notification.getSequenceNumber()+ "\nSend time=" + notification.getTimeStamp()+ "\nMessage=" + notification.getMessage());if (mbean != null) {if (mbean instanceof Hello) {Hello hello = (Hello) mbean;hello.helloWorld(notification.getMessage());}}}}

注册各个MBean,并且为SayHello添加Notificaiton监听器和消息要传递到的目的MBean

package com.jmx.notification.demo;import java.lang.management.ManagementFactory;import javax.management.InstanceAlreadyExistsException;import javax.management.MBeanRegistrationException;import javax.management.MBeanServer;import javax.management.MalformedObjectNameException;import javax.management.NotCompliantMBeanException;import javax.management.ObjectName;import com.sun.jdmk.comm.HtmlAdaptorServer;public class HelloAgent {public static void main(String[] args) throws MalformedObjectNameException, NullPointerException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {//create mbean serverMBeanServer server = ManagementFactory.getPlatformMBeanServer();//create object nameObjectName helloName = new ObjectName("jmx:name=hello");//create mbeanHello hello = new Hello();//register mbean and hello nameserver.registerMBean(hello, helloName);//create adaptorHtmlAdaptorServer adaptor  = new HtmlAdaptorServer();//create adaptor nameObjectName adaptorName = new ObjectName("jmxAD:name=adaptor,port=5050");//create adaptor, adaptor is just a form as show mbean. It has no relation to specific mbean.server.registerMBean(adaptor, adaptorName);//create a notification broadcasterSayHello sayHello = new SayHello();server.registerMBean(sayHello, new ObjectName("jmx:name=sayhello"));sayHello.addNotificationListener(new SayHelloListener(), null, hello);//SayHello notice Hello do sth. through Notificationadaptor.setPort(9999);adaptor.start();System.out.println("....................jmx server start....................");}}

和上一篇Standard MBean相同,访问http://localhost:9999/ ,这次点击作为broadcaster的MBean:SayHello,然后点击hello方法



在控制台输出中可以看到,SayHello将message传递给了Hello



整个代码的一个流程图如下:




0 0
原创粉丝点击