JMX学习笔记(四):Notifications

Notification

JMX API定义了一种机制,使MBean能生成通知,如当信号状态改变,检测到事件或者一个问题时。

要生成通知,MBean必须实现NotificationEmitter接口或继承NotificationBroadcasterSupport类。要发送一个通知必须构造Notification类的实例或者子类(如NotificationChangedAttribute),通知实例产生后,由NotificationBroadcasterSupport的sendNotification方法发送通知。

例:

Step 1 :定义HelloMBean接口

package com.jmx.demo5;

public interface HelloMBean {
	public void sayHello();

	public int add(int x, int y);

	public String getName();

	public int getCacheSize();

	public void setCacheSize(int size);

}

Step 2 :编写HelloMBean的实现类Hello

package com.jmx.demo5;

import javax.management.AttributeChangeNotification;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;

//MBean must extends NotificationBroadcasterSupport or implements NotificationEmitter
public class Hello extends NotificationBroadcasterSupport implements HelloMBean {
	private final String name = "Reginald";
	private int cacheSize = DEFAULT_CACHE_SIZE;
	private static final int DEFAULT_CACHE_SIZE = 200;
	private long sequenceNumber = 1;

	public void sayHello() {
		System.out.println("hello, world");
	}

	public int add(int x, int y) {
		return x + y;
	}

	public String getName() {
		return this.name;
	}

	public int getCacheSize() {
		return this.cacheSize;
	}

	public synchronized void setCacheSize(int size) {
		int oldSize = this.cacheSize;
		this.cacheSize = size;
		System.out.println("Cache size now " + this.cacheSize);

		/**
		 * To send a notification,you need to construct an instance of class
		 * Notification or a Subclass(such as AttributeChangedNotification),and
		 * pass the instance to NotificationBroadcastSupport.sendNotification.
		 * 
		 */
		Notification n = new AttributeChangeNotification(this,
				sequenceNumber++, System.currentTimeMillis(),
				"CacheSize changed", "CacheSize", "int", oldSize,
				this.cacheSize);

		sendNotification(n);
	}

	@Override
	public MBeanNotificationInfo[] getNotificationInfo() {
		String[] types = new String[] { AttributeChangeNotification.ATTRIBUTE_CHANGE };
		String name = AttributeChangeNotification.class.getName();
		String description = "An attribute of this MBean has changed";
		MBeanNotificationInfo info = new MBeanNotificationInfo(types, name,
				description);
		return new MBeanNotificationInfo[] { info };
	}

}

Step 3:创建MBeanServer,标识MBean,注册MBean,并运行Main方法:

package com.jmx.demo5;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;
import javax.management.ObjectName;

public class Main {
	public static void main(String[] args) throws Exception{
		MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
		ObjectName name = new ObjectName("com.jmx.demo:type=Hello");
		Hello mbean = new Hello();
		mbs.registerMBean(mbean, name);
		System.out.println("Waiting forever...");
		Thread.sleep(Long.MAX_VALUE);
		
	}
}

微笑在Jconsole中查看运行结果:通知选项初始状态没有值,点击订阅后,通知项为0


微笑更改CacheSize的值后,在观察通知选项,变为1



总结:MBean实现通知机制,必须继承NotificationBroadcasterSupport类或实现NotificationEmitter接口,用Notification类构造通知实例,发送通知实例由NotificationBroadcaterSupport.sendNotification方法;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值