`
ywChen
  • 浏览: 117786 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JMX(三)Notification

    博客分类:
  • J2EE
 
阅读更多

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按钮来执行它,这是控制台显示:


 

  • 大小: 13.1 KB
  • 大小: 38.4 KB
  • 大小: 9.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics