我使用的是Java1.6中的平台MBeans服务器,它在一个OSGi容器中运行。
主要用于统计计数器和事件的MBeans。它们的实现在一个捆绑包中,但它们在其他几个捆绑包中实例化。每个MBean都会自动向platform MBean服务器注册自身。
问题是,当我通过JMX附加并查询MBeans时,我只获得当前已注册的类,并且它们在实例化之前不会被注册(要么是因为静态类在第一次访问之前不存在,要么是因为包还没有启动,或者计数器在某些逻辑中很深,直到第一次使用才会存在)。
我需要一些在MBeans服务器中订阅“注册”事件的方法。或确定何时有新的MBeans添加到服务器的某种其它方式。检测删除的MBeans将是一个额外的好处,但不是必须的。
我得到的唯一解决方案基本上是一个线程,它每隔5秒轮询服务器一次,并将结果与保存的MBeans列表进行比较,这是非常丑陋的。
发布于 2011-04-02 02:17:30
所有符合要求的MBeanServers都将通知监听器MBean注册和注销事件。关键是在MBeanServerDelegate上注册通知侦听器。
例如,一个javax.management.NotificationListener实现:
public class MBeanEventListener implements NotificationListener {
public void handleNotification(Notification notification, Object handback) {
MBeanServerNotification mbs = (MBeanServerNotification) notification;
if(MBeanServerNotification.REGISTRATION_NOTIFICATION.equals(mbs.getType())) {
log("MBean Registered [" + mbs.getMBeanName() + "]");
} else if(MBeanServerNotification.UNREGISTRATION_NOTIFICATION.equals(mbs.getType())) {
log("MBean Unregistered [" + mbs.getMBeanName() + "]");
}
}
}要注册监听程序,请根据MBeanServerDelegate添加通知监听程序。如果您想要过滤实际收到通知的MBeanServerNotificationFilter,则可以使用MBeans。在此示例中,为所有ObjectNames启用了筛选器。
// Get a reference to the target MBeanServer
MBeanServerConnection server = ManagementFactory.getPlatformMBeanServer();
MBeanServerNotificationFilter filter = new MBeanServerNotificationFilter();
filter.enableAllObjectNames();
server.addNotificationListener(MBeanServerDelegate.DELEGATE_NAME, new MBeanEventListener(), filter, null);每次注册或取消注册MBean时,您的侦听器实现都会收到回调。
发布于 2011-03-29 16:26:32
这听起来像是你想看到所有存在于任何地方的MBeans,但你不能,因为代码不能一次创建所有它们。
我建议使用代码生成器为所有真正的MBeans创建“视图”MBeans。例如,使用类或标记接口来定位MBeans。视图bean都应该在启动时创建。
现在,当真正的MBean出现时,它应该抬头查看自己的视图,并将自己挂接起来。
这样,所有的MBeans都是可见的,启动不会受到太多影响(因为视图MBeans将非常便宜),并且视图MBeans可以告诉你实际MBeans的状态。
编辑如果你真的只需要知道什么时候注册了一个新的MBean,那么扩展一个现有的MBeanServer并覆盖registerMBean(Object, ObjectName)。通过设置系统属性javax.management.builder.initial来安装新的MBeanServer。
现在定义一个公开此信息的MBean。
https://stackoverflow.com/questions/5469657
复制相似问题