gpt4 book ai didi

java - 检测新注册的 MBean

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:18 25 4
gpt4 key购买 nike

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

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

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

我需要某种方式来订阅 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 添加通知监听器.您可以使用 MBeanServerNotificationFilter如果您想过滤您实际收到通知的 MBean。在此示例中,为所有 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 时,您的监听器实现都会收到回调。

关于java - 检测新注册的 MBean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5469657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com