Java 为什么取消注册或重新注册MBean会对Jmx产生影响?

Java 为什么取消注册或重新注册MBean会对Jmx产生影响?,java,jmx,mbeans,Java,Jmx,Mbeans,我想这样注册MBean: MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = null; try { name = ObjectNameProvider.getObjectName(); mbs.registerMBean(ApplicationTracker.getInstance(), name); 启动应用程序时,注册失败,引

我想这样注册MBean:

    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
    ObjectName name = null;
    try {
        name = ObjectNameProvider.getObjectName();
        mbs.registerMBean(ApplicationTracker.getInstance(), name);
启动应用程序时,注册失败,引发了javax.management.InstanceAlreadyExistsException,我无法使用JMX功能

然而,一切都很好,如果我像下面那样取消注册或重新注册MBean,没有任何例外为什么?

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        ObjectName name = null;
        try {
            name = ObjectNameProvider.getObjectName();
            if(mbs.isRegistered(name)){
                mbs.unregisterMBean(name);
            }
            mbs.registerMBean(ApplicationTracker.getInstance(), name);

您确定在注册MBean时代码没有并行运行吗?只有当具有相同对象名称的MBean已经存在时,才会引发“javax.management.InstanceAlreadyExistsException”。顺便说一句,ObjectNameProvider.getObjectName()返回的对象名是什么?有趣的是,如果我只是用一个catch“吞下”异常,并继续使用已经注册的ObjectName,就好像什么都没有发生一样,那么稍后我就无法访问Jmx功能。我需要注销并重新注册(使用完全相同的对象),然后一切正常。ObjectNameProvider.getObjectName()是一个单例,向其所有调用者提供相同的ObjectName对象。“ObjectNameProvider.getObjectName()是一个单例,向其所有调用者提供相同的ObjectName对象。”-这是否意味着您将在同一对象名称下注册更多不同的实例?否,我总是使用相同的对象,首先在“mbs.isRegistered()”调用之前添加调试输出(或设置断点),以确保您的例程只被调用一次。此外,还可以添加Thread.dumpStack()以获取执行上下文。