检测新注册的MBean
我在Java 1.6中使用平台MBeans服务器,在OSGi容器中运行。
主要使用MBean作为统计计数器和事件。 它们的实现在一个包中,但它们在其他几个包中实例化。 每个MBean都使用平台MBean服务器自行注册。
问题是,当我通过JMX附加并查询MBean时,我只获得当前注册的那些,并且在它们被实例化之前它们不会被注册(因为静态类在第一次访问之前不存在,或者因为捆绑还没有开始,或者计数器深入一些逻辑,直到第一次使用才会存在)
我需要某种方式来订阅MBeans服务器中的“注册”事件。 或者确定何时向服务器添加新MBean的其他方法。 检测已删除的MBean将是一个额外的好处,但不是必需的。
我得到的唯一解决方案基本上是一个每隔5秒轮询一次服务器的线程,并将结果与保存的MBean列表进行比较,这非常难看。
所有兼容的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添加通知侦听器。 如果要过滤实际通知的MBean,可以使用MBeanServerNotificationFilter 。 在此示例中,为所有ObjectName启用了filter。
// 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时,您的侦听器实现都将获得回调。
这听起来像你想看到所有MBean存在于任何地方,但你不能,因为代码不会立即创建所有MBean。
我建议使用代码生成器为所有真正的MBean创建“视图”MBean。 例如,使用类或标记接口来定位MBean。 应该在启动时创建视图bean。
现在,当真正的MBean出现时,它应该查看它的视图并自行连接。
这样,所有MBean将始终可见,启动不会受到太大影响(因为视图MBean将非常便宜),并且视图MBean可以告诉您真实MBean的状态。
[编辑]如果您真的只需要知道何时注册了新的MBean,请扩展现有的MBeanServer
并覆盖registerMBean(Object, ObjectName)
。 通过设置System属性javax.management.builder.initial
安装新的MBeanServer
。
现在定义一个公开此信息的MBean。
- 反向字符串方法
- 如何使用JOOQ在PostgreSQL中插入带有JSON列的可更新记录?
- Java运行时环境检测到致命错误:内部错误; 错误:ShouldNotReachHere()
- Spring引导Hibernate错误java.lang.NoSuchMethodError:javax.persistence.JoinColumn.foreignKey()Ljavax / persistence / ForeignKey;
- Java:循环类路径中的所有类
- Weka:如何在java中获取测试实例的预测值?
- 如何获取JFrame中的所有元素?
- Java客户端到WCF服务互操作与相互证书 – 无法解析KeyInfo以validation签名
- 用于合并java bean的工具