首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在检测新注册的MBeans

正在检测新注册的MBeans
EN

Stack Overflow用户
提问于 2011-03-29 16:15:14
回答 2查看 3.2K关注 0票数 6

我使用的是Java1.6中的平台MBeans服务器,它在一个OSGi容器中运行。

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-02 02:17:30

所有符合要求的MBeanServers都将通知监听器MBean注册和注销事件。关键是在MBeanServerDelegate上注册通知侦听器。

例如,一个javax.management.NotificationListener实现:

代码语言:javascript
复制
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启用了筛选器。

代码语言:javascript
复制
    // 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时,您的侦听器实现都会收到回调。

票数 13
EN

Stack Overflow用户

发布于 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。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5469657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档