JDK1.6 中 ManagementFactory 的托管 Mbean - NotCompliantMBeanException:

2024-06-30

我使用 ManagementFactory 来获取 JDK1.5 和 JBOSS 4.X 中的 ManagedMbeans。现在想将我的相同代码移至 JDK 1.6。 Mbean 部分中断并抛出异常

引起原因:javax.management.NotCompliantMBeanException:类未公开管理接口:java.lang.Object 原因:java.lang.Exception:无法向 JBoss MBeanServer 注册平台 (JVM) MBean


这里有两种方法:

  1. 制作JBossAS使用平台MBeanServer http://community.jboss.org/wiki/JBossMBeansInJConsole.
  2. 创建您自己的代理来实现 MXBean 接口(并在接口中具有 *MBean 兼容名称)并将调用委托给实际的 MXBean。

#2 的示例代码

这是一个 JBoss ServiceMBean 实现,它将跨平台代理 MXBean 发布到 JBoss MBeanServer。 (为简洁起见,删除了导入)。这是与我概述的方法略有不同的方法,但是精神上的, 这是相同的。其中还有一些额外的功能来管理通知的转发。

package org.helios.jboss.jmx.mxbean;

public class MXBeanPublisher extends ServiceMBeanSupport implements MXBeanPublisherMBean {
    protected final Map<ObjectName, DynamicMBeanNotifEnabled> published = new HashMap<ObjectName, DynamicMBeanNotifEnabled>();
    protected final ExecutorService executor = Executors.newCachedThreadPool();
    public Set<ObjectName> getPublishedNames() {
        return Collections.unmodifiableSet(published.keySet());
    }
    public static interface DynamicMBeanNotifEnabled extends NotificationBroadcaster, NotificationEmitter, DynamicMBean, NotificationListener {

        public void startNotifications() throws InstanceNotFoundException;
        public void stopNotifications() throws InstanceNotFoundException, ListenerNotFoundException;
    }


    protected DynamicMBeanNotifEnabled publishMXBean(final ObjectName on, Class<?> iface) throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, InstanceNotFoundException {
        final MBeanServer platformAgent = ManagementFactory.getPlatformMBeanServer();
        DynamicMBeanNotifEnabled dmb = new DynamicMBeanNotifEnabled() {
            NotificationBroadcasterSupport bcaster = new NotificationBroadcasterSupport(executor);
            public Object getAttribute(String attribute)throws AttributeNotFoundException, MBeanException, ReflectionException {
                try {
                    return platformAgent.getAttribute(on, attribute);
                } catch (InstanceNotFoundException e) {
                    throw new MBeanException(e, "Instance [" + on + "] not found");
                }
            }
            public void setAttribute(Attribute attribute)throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {
                try {
                    platformAgent.setAttribute(on, attribute);
                } catch (InstanceNotFoundException e) {
                    throw new MBeanException(e, "Instance [" + on + "] not found");
                }               
            }
            public AttributeList getAttributes(String[] attributes) {
                try {
                    return platformAgent.getAttributes(on, attributes);
                } catch (Exception e) {
                    throw new RuntimeException("Failed to getAttributes on [" + on + "]", e);
                }               
            }
            public AttributeList setAttributes(AttributeList attributes) {
                try {
                    return platformAgent.setAttributes(on, attributes);
                } catch (Exception e) {
                    throw new RuntimeException("Failed to setAttributes on [" + on + "]", e);
                }                               
            }
            public Object invoke(String actionName, Object[] params,String[] signature) throws MBeanException, ReflectionException {
                try {
                    return platformAgent.invoke(on, actionName, params, signature);
                } catch (InstanceNotFoundException e) {
                    throw new MBeanException(e, "Instance [" + on + "] not found");
                }                                   
            }
            public MBeanInfo getMBeanInfo() {
                try {
                    return platformAgent.getMBeanInfo(on);
                } catch (Exception e) {
                    throw new RuntimeException("Failed to get MBeanInfo for Instance [" + on + "]", e);
                }                                               
            }
            public void addNotificationListener(NotificationListener listener,
                    NotificationFilter filter, Object handback) {
                bcaster.addNotificationListener(listener, filter, handback);
            }
            public void removeNotificationListener(NotificationListener listener)
                    throws ListenerNotFoundException {
                bcaster.removeNotificationListener(listener);
            }
            public void removeNotificationListener(
                    NotificationListener listener, NotificationFilter filter,
                    Object handback) throws ListenerNotFoundException {
                bcaster.removeNotificationListener(listener, filter, handback);
            }
            public MBeanNotificationInfo[] getNotificationInfo() {
                return bcaster.getNotificationInfo();
            }

            public void startNotifications() throws InstanceNotFoundException {
                ManagementFactory.getPlatformMBeanServer().addNotificationListener(on, this, null, null);
            }
            public void stopNotifications() throws InstanceNotFoundException, ListenerNotFoundException {
                ManagementFactory.getPlatformMBeanServer().removeNotificationListener(on, this, null, null);
            }

            @Override
            public void handleNotification(Notification notification, Object handback) {
                bcaster.sendNotification(notification);
            }
        }; 
        if(server.isRegistered(on)) return null;
        server.registerMBean(dmb, on);
        published.put(on, dmb);
        dmb.startNotifications();
        return dmb;
    }

    public void startService() throws Exception {
        try { publishMXBean(new ObjectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME), OperatingSystemMXBean.class); } catch (Exception e) {
            log.error("Failed to publish OperatingSystemMXBean", e);
        };
        try { publishMXBean(new ObjectName(ManagementFactory.CLASS_LOADING_MXBEAN_NAME), ClassLoadingMXBean.class); } catch (Exception e) {
            log.error("Failed to publish ClassLoadingMXBean", e);
        };
        try { publishMXBean(new ObjectName(ManagementFactory.MEMORY_MXBEAN_NAME), MemoryMXBean.class); } catch (Exception e) {
            log.error("Failed to publish MemoryMXBean", e);
        };
        try { publishMXBean(new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME), RuntimeMXBean.class); } catch (Exception e) {
            log.error("Failed to publish RuntimeMXBean", e);
        };
        try { publishMXBean(new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME), ThreadMXBean.class); } catch (Exception e) {
            log.error("Failed to publish RuntimeMXBean", e);
        };
        for(GarbageCollectorMXBean gc: ManagementFactory.getGarbageCollectorMXBeans()) {
            try { publishMXBean(new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",name=" + gc.getName()), GarbageCollectorMXBean.class); } catch (Exception e) {
                log.error("Failed to publish GarbageCollectorMXBean[" + gc.getName() + "]", e);
            };          
        }
        for(MemoryManagerMXBean mm: ManagementFactory.getMemoryManagerMXBeans()) {
            try { publishMXBean(new ObjectName(ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE + ",name=" + mm.getName()), MemoryManagerMXBean.class); } catch (Exception e) {
            };          
        }
        for(MemoryPoolMXBean mp: ManagementFactory.getMemoryPoolMXBeans()) {
            try { publishMXBean(new ObjectName(ManagementFactory.MEMORY_POOL_MXBEAN_DOMAIN_TYPE + ",name=" + mp.getName()), MemoryPoolMXBean.class); } catch (Exception e) {
                log.error("Failed to publish MemoryPoolMXBean[" + mp.getName() + "]", e);
            };          
        }
    }

    public void stopService() {
        for(Map.Entry<ObjectName, DynamicMBeanNotifEnabled> entry: published.entrySet()) {
            try { server.unregisterMBean(entry.getKey()); } catch (Exception e) {}
            try { entry.getValue().stopNotifications(); } catch (Exception e) {}
        }
        published.clear();
    }
}

界面很简单

package org.helios.jboss.jmx.mxbean;
public interface MXBeanPublisherMBean extends ServiceMBean {
    public Set<ObjectName> getPublishedNames();
}

此 MBean 部署描述符将部署服务:

<mbean code="org.helios.jboss.jmx.mxbean.MXBeanPublisher" name="jboss.deployer:service=MXBeanPublisher" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDK1.6 中 ManagementFactory 的托管 Mbean - NotCompliantMBeanException: 的相关文章

随机推荐

  • 我使用 difftime 的 c 函数有时会返回 65535

    我有一个函数 使用 difftime 来检测自通信心跳停止以来的时间 以秒为单位 该函数的运行速度可以达到每 50 毫秒一次 该函数似乎可以工作 除了偶尔返回 65535 之外 我可以将执行次数减少到每秒一次 因为 difftime 的返回
  • 命名空间与常规包

    命名空间 Python 包之间有什么区别 没有 init py 和一个常规的Python包 有一个 init py 特别是当 init py普通包裹是空的吗 我很好奇 因为最近我忘记了 init py在我制作的包中 我从未注意到任何问题 事
  • Laravel 7.x:新鲜和刷新方法之间的区别?

    当我阅读 Laravel 文档时 我遇到了一个名为fresh and refresh关于 Eloquent 模型 请解释一下它们之间的主要区别 我很难理解这些 这是对refresh方法上Illuminate Database Eloquen
  • 我可以在Java中设置枚举起始值吗?

    我使用枚举来创建一些常量 enum ids OPEN CLOSE OPEN 值为零 但我希望它为 100 这可能吗 Java 枚举与 C 或 C 枚举不同 后者实际上只是整数的标签 Java 枚举的实现更像是类 它们甚至可以有多个属性 pu
  • Django CSRF 验证失败。请求已中止

    我正在构建这篇 wiki 帖子 当我尝试保存数据时遇到错误 我现在使用的是 django 1 4 3 我使用的教程相当旧 所以我认为旧版本中没有包含 CSRF Forbidden 403 CSRF verification failed R
  • 如何在同一规则中混合字符串解析和块解析?

    很酷的是 Rebol 的 PARSE 方言足够通用 它可以对符号结构以及字符串进行模式匹配和提取 像这样 match a single a character followed by any number of b chars gt gt
  • 需要以下 scala 片段的简单英语翻译

    我是 scala 和 playframework 的新手 有人可以将下面的代码片段翻译成简单的英语吗 对于上下文 可以在这里找到 http www playframework org documentation 2 0 4 ScalaSec
  • PerformSegueWithIdentifier 不会产生带有标识符错误的 Segue

    我很难让 PerformSegueWithIdentifier 正常工作 我不断得到 Receiver
  • 从 WiX 引导 SQL Express?

    我正在开发一个 WPF 应用程序 并使用 WiX 作为安装程序 我想开始使用 SQL Express 2012 但希望首先解决安装程序问题 我正在寻找使用 WiX 检测 引导 安装 升级和卸载 SQL Express 2012 的完整示例
  • 在特定路线中添加类 - Angular 2

    当我在某条路线上时 我正在尝试添加课程 代码在我的 AppComponent 中 我使用 ngClass Component selector my app template a Some html code 然后我在同一个 app com
  • 可选的比较器

    I have abstract class OptionalComparator
  • 我可以为每个片段单独提供工具栏吗?如何处理导航抽屉

    在我的应用程序中 某些页面的工具栏中有自定义视图 有些片段具有透明工具栏 有些片段具有坐标布局滚动 因此 我决定为每个片段单独设置工具栏 我想知道这是否是一个好的做法 如果有人已经这样做了 请分享代码或示例 您可以在片段中使用自定义工具栏
  • 初始刷新时 RubberDuck 解析错误

    我安装了 RubberDuck 并打开了用作代码测试场的 Access 2007 数据库 当我单击 RD 工具栏上的 刷新 时 文本继续显示Pending 几次点击刷新按钮后我打开Settings并取消选中 重新选中随机复选框并单击Ok 此
  • 在 cmd 上使用 Cygwin 命令进行彩色输出

    操作系统 Windows XP SP3 不幸的是 我已经下载并安装了最新版本的 Cygwin 和 Git 我还配置了我的环境 以在系统路径中包含每个文件夹的 bin 文件夹 并设置用户变量 TERM msys 我现在可以进入 cmd 并使用
  • iPhone 向右翻转按钮(如 iTunes)

    我正在尝试在两种视图之间切换 这很简单 代码如下 但我还想同时翻转用于执行翻转的按钮 当您播放曲目时 您可以在 iPod 应用程序中看到此行为 点击翻转按钮可在封面艺术和曲目列表之间翻转 但同时会翻转按钮 这是导航控制器上的一个页面 我要翻
  • 使用 Spring Security Java 配置时禁用基本身份验证

    我正在尝试使用 Spring Security java 配置来保护 Web 应用程序 配置如下 Configuration EnableWebMvcSecurity public class SecurityConfiguration e
  • 着色器可以旋转形状以面向相机吗?

    我制作了一个球出现在 3D 空间中的场景 三角球耗费大量资源 所以我使用带有球纹理的二维表面 四边形 来完成此操作 但现在我需要在每次相机移动时调整形状的方向 我使用位置变换和 LookAt 方法来完成此操作 问题是我可以优化这个吗 如果可
  • 如何获取 Google Team Drive 的管理者/贡献者/等?

    Team Drive 有五个权限级别 Manager 内容管理者 贡献者 评论者 Viewer The 文件夹API https developers google com apps script reference drive folde
  • 如何更改 Java 中不同类的变量?

    如何更改 Java 中不同类的变量 我正在尝试更改另一个类中的变量 然后在第一个类中使用它 我在 First 类中创建了一个变量 并将其值设置为 1 然后我尝试在 Second 类中将同一变量的值更改为 2 但是当我在 First 类中使用
  • JDK1.6 中 ManagementFactory 的托管 Mbean - NotCompliantMBeanException:

    我使用 ManagementFactory 来获取 JDK1 5 和 JBOSS 4 X 中的 ManagedMbeans 现在想将我的相同代码移至 JDK 1 6 Mbean 部分中断并抛出异常 引起原因 javax management