Mbean之间的通信是必不可少的,Notification就起到了在Mbean之间沟通桥梁的作用。JMX notification 由四部分组成:
[list]
[*]Notification 这个相当于一个信息包,封装了需要传递的信息
[*]Notification broadcaster 这相当于一个广播器,把消息广播出去
[*]Notification listerner 这是一个监听器,用于监听广播出来的Notification消息
[*]Notification filter 这是一个过滤器,过滤掉不需要的Notification消息
[/list]
Notification broadcaster不需要我们实现,JMX的内部已经有了。Notification filter一般也很少用。下面的例子主要用到了Notification、Notification listerner。
在http://ldbjakyo.iteye.com/admin/blogs/778268
这篇文章中的例子HelloWorld中有一个printHello(String whoName)方法,意思根据碰到的是谁来打招呼,比如:
Jack从对面走过来,说:“hi”
我们回之以礼,说:“Hello, jack”
首先这需要Jack先说一个hi(相应一个操作方法),然后他说的话封装成声波(相当Notification消息包)传递出去。然后我们还要给Jakc装上一个监听器(Hello的耳朵),这个监听器将捕捉到Jack的声波语音包,并进行相应处理,即说“Hello, jack”。
1、Jack类及其相应的MBean
[list]
[*]必需继承NotificationBroadcasterSupport
[*]此类只有一个hi方法,方法只有两句:创建一个Notification消息包,然后将包发出去
[*]如果你还要在消息包上附加其他数据,Notification还有一个setUserData方法可供使用
[/list]
2、接下来是他的MBean
3、创建一个Listener,监听到的Notification消息包将由此类负责处理。
4、修改HelloAgent如下(加上了关于jack的三句):
这样当调用jack hi方法 的时候,就顺带调用了HelloWorld 的 void printHello(String name)方法
[list]
[*]Notification 这个相当于一个信息包,封装了需要传递的信息
[*]Notification broadcaster 这相当于一个广播器,把消息广播出去
[*]Notification listerner 这是一个监听器,用于监听广播出来的Notification消息
[*]Notification filter 这是一个过滤器,过滤掉不需要的Notification消息
[/list]
Notification broadcaster不需要我们实现,JMX的内部已经有了。Notification filter一般也很少用。下面的例子主要用到了Notification、Notification listerner。
在http://ldbjakyo.iteye.com/admin/blogs/778268
这篇文章中的例子HelloWorld中有一个printHello(String whoName)方法,意思根据碰到的是谁来打招呼,比如:
Jack从对面走过来,说:“hi”
我们回之以礼,说:“Hello, jack”
首先这需要Jack先说一个hi(相应一个操作方法),然后他说的话封装成声波(相当Notification消息包)传递出去。然后我们还要给Jakc装上一个监听器(Hello的耳朵),这个监听器将捕捉到Jack的声波语音包,并进行相应处理,即说“Hello, jack”。
1、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起个名称 Notification n n.getType()
this, //由谁发出的Notification Notification n n.getSource()
++seq,//一系列通知中的序列号,可以设任意数值 Notification n n.getSequenceNumber()
System.currentTimeMillis(),//发出时间 Notification n n.getTimeStamp()
"Jack");//发出的消息文本 Notification n n.getMessage()
//发出去
sendNotification(n);
}
} [list]
[*]必需继承NotificationBroadcasterSupport
[*]此类只有一个hi方法,方法只有两句:创建一个Notification消息包,然后将包发出去
[*]如果你还要在消息包上附加其他数据,Notification还有一个setUserData方法可供使用
[/list]
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) {
HelloWorld hello = (HelloWorld) handback;
hello.printHello(n.getMessage());
}
}
}
}4、修改HelloAgent如下(加上了关于jack的三句):
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import com.lidongbo.HelloWorld;
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("author:name=HelloWorld");
HelloWorld hello=new HelloWorld();
server.registerMBean(hello, helloName);
ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter");
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
server.registerMBean(adapter, adapterName);
adapter.setPort(8080);
Jack jack = new Jack();
server.registerMBean(jack, new ObjectName("HelloAgent:name=jack")); //注册jack的那个MBean实现
jack.addNotificationListener(new HelloListener(), null, hello); //jackMBean 添加说hello的监听 ,这样就实现了MBean调MBean了
adapter.start();
System.out.println("start.....");
}
} 这样当调用jack hi方法 的时候,就顺带调用了HelloWorld 的 void printHello(String name)方法
本文通过具体示例详细介绍了如何利用JMX Notification机制实现在MBeans间的通信过程。包括Notification消息包的创建、监听器的定义及如何响应这些消息。
1803

被折叠的 条评论
为什么被折叠?



