最近写代码用到jmx通知机制,小记一下
代码中实现的通知机制
广播类
//广播类 必须实现NotificationBroadcaster接口,但是java提供了一个NotificationBroadcasterSupport类实现了NotificationBroadcaster接口,可以用作发送通知的 MBean 的超类,并提供一个方法叫sendNotification
//SipTraceMXBean收到跟踪消息,通过此方法将通知消息发送给监听者
private void sendToConsole(TracePacket packet) {
Notification notif = new Notification(cC.getJmxNotifType(), cT, -1);
notif.setUserData(packet.getAttributeMap());
cT.sendNotification(notif);
}
监听者
//监听类 必须实现NotificationListener接口
public class ConsoleListener implements NotificationListener, Serializable{
public void handleNotification(Notification notification, Object handback) {}
Object notif = notification.getUserData();
//通知消息数据的处理
。。。。。。。。
}
handback -一个不透明对象,用于帮助侦听器关联关于 MBean 发出者的信息。在 addListener 调用期间将此对象传递到 MBean,并在不经修改的情况下重发到侦听器。MBean 对象不应使用或修改该对象。
监听者注册
//监听端通过获取到通知端的jmx连接,注册listener
url =new JMXServiceURL((String) c.get("traceserver"));
jmxConnector =JMXConnectorFactory.connect(url);
MBeanServerConnection mbsc =jmxConnector.getMBeanServerConnection();
ConsoleListener cL = new ConsoleListener();
mbsc.addNotificationListener(objectName, cL, null, null);
void addNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, IOException