6

我正在使用 Java 1.6 中的平台 MBeans 服务器,在 OSGi 容器中运行。

主要将 MBean 用于统计计数​​器和事件。它们的实现在一个包中,但它们在其他几个包中实例化。每个 MBean 都会向平台 MBean 服务器自动注册自己。

问题是,当我通过 JMX 附加并查询 MBean 时,我只得到当前注册的那些,并且在它们被实例化之前它们不会被注册(或者因为静态类在第一次访问之前不存在,或者因为捆绑包还没有开始,或者计数器在某些逻辑中很深,直到第一次使用才会存在)

我需要某种方式来订阅 MBeans 服务器中的“注册”事件。或者其他确定何时将新的 MBean 添加到服务器的方法。检测已删除的 MBean 将是一个额外的好处,但不是必需的。

我得到的唯一解决方案基本上是每 5 秒轮询一次服务器并将结果与​​保存的 MBean 列表进行比较的线程,这非常难看。

4

2 回答 2

13

所有兼容的 MBeanServer 将通知 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 启用了过滤器。

    // 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-04-01T18:17:30.230 回答
3

这听起来像是您希望查看存在于任何地方的所有 MBean,但您不能,因为代码不会一次创建所有 MBean。

我建议使用为所有真正的 MBean 创建“视图”MBean 的代码生成器。例如,使用类或标记接口来定位 MBean。视图 bean 都应该在启动时创建。

现在,当真正的 MBean 出现时,它应该查看它的视图并将自己连接起来。

这样,所有 MBean 将始终可见,启动不会受到太大影响(因为视图 ​​MBean 将非常便宜),并且视图 MBean 可以告诉您真实 MBean 的状态。

[编辑]如果您真的只需要知道何时注册新的 MBean,请扩展现有的MBeanServer并覆盖registerMBean(Object, ObjectName). MBeanServer通过设置系统属性安装新的javax.management.builder.initial

现在定义一个公开此信息的 MBean。

于 2011-03-29T08:26:31.530 回答