【问题标题】:Cannot integrate JMX with Spring application无法将 JMX 与 Spring 应用程序集成
【发布时间】:2014-04-01 14:50:15
【问题描述】:

我有一个 SPRING 申请。当我跑步时

mvn jetty:run

一切正常。

我想在我的项目中使用 JMX

我创建了另一个项目,我尝试了初学者教程,我能够看到 jconsole 的一些变化。

现在,我想在我的实际项目中使用 JMX,并且我想使用管理 JMX 的 SPRING 库 - 关注这篇文章

How to integrate JMX with Spring?

我有课:

public class MyMainClass {
  private int var1;
  private int var2;
  private TimeUnit var3;

  // public getters and setters
  public static MyXXXClass<String, Object> getInstance();
}

config.xml

<!-- other beans -->
<bean id="myid" class="com.my.package.MyMainClass">
    <property name="var1" value.../>
    <property name="var2" value... />
    <property name="var3" value.../>
</bean>
<!-- other beans -->

我更改了一些东西以使其适用于 JMX。

我添加了一个接口:

import java.util.concurrent.TimeUnit;

public interface IMyMainClassBean {

    public int getVar1();

    public void setVar1(int var1);

    public int getVar2();

    public void setVar2(int var2);

    public TimeUnit getVar3();

    public void setVar3(TimeUnit var3);
}

我在课堂上添加了实现

public class MyMainClassBean implements IMyMainClassBean {...}

最后,我编辑了我的 xml 文件:

<!-- other beans -->
<bean id="myid" class="com.my.package.MyMainClassBean">
    <property name="var1" value.../>
    <property name="var2" value... />
    <property name="var3" value.../>
</bean>

<!-- this bean must not be lazily initialized if the exporting is to happen -->
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
    lazy-init="false">
    <property name="beans">
        <map>
            <entry key="bean:name=testBean1" value-ref="myid" />
        </map>
    </property>
</bean>
<!-- other beans -->

现在,当我启动我的服务器时,它给了我很多异常(日志真的很长,所以我只复制了我认为最重要的部分)。

Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [com.my.package
.MyMainClassBean@3d4395fb] with key 'bean:name=testBean1'; nested exception is javax.management.InstanceAlreadyExistsExcep
tion: bean:name=testBean1
        at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:602)
        at org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExporter.java:527)
        at org.springframework.jmx.export.MBeanExporter.afterPropertiesSet(MBeanExporter.java:413)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableB
eanFactory.java:1571)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBean
Factory.java:1509)
        ... 163 more
Caused by: javax.management.InstanceAlreadyExistsException: bean:name=testBean1
        at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:453)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.internal_addObject(DefaultMBeanServerInterceptor.java:1484)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:963)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:917)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:312)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:483)
        at org.springframework.jmx.support.MBeanRegistrationSupport.doRegister(MBeanRegistrationSupport.java:195)
        at org.springframework.jmx.export.MBeanExporter.registerBeanInstance(MBeanExporter.java:655)
        at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:592)
        ... 167 more
[WARNING] Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myTask' defined
 in class path resource [anotherconfigfile.xml]: Cannot resolve reference to bean 'anotherimport' while setting bean property 'targetObj
ect'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'anotherimport' defin
ed in class path resource [anotherconfigfile.xml]: Cannot create inner bean 'myTotallyAnotherClass' of type [com.my.package.another.MyTotallyAnotherClass]
 while setting bean property 'myTotallyAnotherClass'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creatin
g bean with name 'myTotallyAnotherClass' defined in class path resource [anotherconfigfile.xml]: Instantiation of bean failed; nested exception is
 org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.my.package.another.MyTotallyAnotherClass]: Co
nstructor threw exception; nested exception is java.lang.ExceptionInInitializerError:
javax.management.InstanceAlreadyExistsException: bean:name=testBean1
        at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:453)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.internal_addObject(DefaultMBeanServerInterceptor.java:1484)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:963)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:917)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:312)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:483)
        at org.springframework.jmx.support.MBeanRegistrationSupport.doRegister(MBeanRegistrationSupport.java:195)
        at org.springframework.jmx.export.MBeanExporter.registerBeanInstance(MBeanExporter.java:655)
        at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:592)
        at org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExporter.java:527)
        at org.springframework.jmx.export.MBeanExporter.afterPropertiesSet(MBeanExporter.java:413)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableB
eanFactory.java:1571)

我什至不知道如何调试它。

感谢您的所有提示。

【问题讨论】:

    标签: java spring jmx


    【解决方案1】:

    原因:javax.management.InstanceAlreadyExistsException: bean:name=testBean1

    这是想告诉您,您有 2 个名称相同的 bean ObjectNamebean:name=testBean1 正在注册到 MBeanExporter。但是,除非您的 beans 映射中有其他 XML 文件或更多条目,否则不应该有。

    我什至不知道如何调试它。

    您可以在 JmxMBeanServer.registerMBean(...) 方法中放置一个断点,以查看正在注册的 bean 以查看您是否可以弄清楚为什么会出现重复。


    顺便说一句,我的SimpleJMX library 是一种通过 JMX 导出 bean 的简单方法。也有很好的 Spring 支持。这是关于using with Spring 的文档。还有一个Spring test program,它演示了您需要做什么才能使其正常工作。这是Spring XML file

    【讨论】:

    • 你好,昨晚我阅读了很多关于 Spring 的信息,最后,我调试了问题出在哪里。在开始使用 JMX 之前,我必须清理我的应用程序。如果你有兴趣,我在这里发布了这个问题:stackoverflow.com/q/22805512/1021970。无论如何,你的库看起来非常好,可能(99%)我会在我的项目中使用它。为你投票,但为“回答勾号”我会等到我的代码完成;)
    【解决方案2】:

    发生这种情况的原因是 bean 甚至在初始化一次后仍试图初始化。

    我在 Spring TestNG 测试用例中的 RabbitMQ 配置中遇到了同样的问题。

    使用@DirtiesContext 作为每个测试用例类的类级别注释。

    这将创建 applicationcontext 并在测试用例类运行后将其终止,并且将为下一个测试用例类创建新的 applicationcontext。

    例子-

    @Test
    @ContextConfiguration(classes = { ApplicationConfig.class })
    @DirtiesContext
    @WebAppConfiguration
    public class ATest extends AbstractTestNGSpringContextTests{
        @BeforeSuite
        public void setup() throws Throwable {
    
        }
        @AfterSuite
        public void teardown() {
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多