无法将JMX与Spring应用程序集成

我有一个SPRING应用程序。 当我跑

mvn jetty:run 

一切都好。

我想在我的项目中使用JMX

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

现在,我想在我的真实项目中使用JMX,我想使用管理JMX的SPRING库 – 关注这篇文章

如何将JMX与Spring集成?

我有一节课:

 public class MyMainClass { private int var1; private int var2; private TimeUnit var3; // public getters and setters public static MyXXXClass getInstance(); } 

config.xml中

        

我改变了一些东西,使它适用于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); } 

我在我的class级添加了工具

 public class MyMainClassBean implements IMyMainClassBean {...} 

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

                

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

 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) 

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

谢谢你的所有提示。

引起:javax.management.InstanceAlreadyExistsException:bean:name = testBean1

这是试图告诉您,您有两个名为ObjectName of bean:name=testBean1正在向MBeanExporter注册。 但是,除非beans映射中有其他XML文件或更多条目,否则不应该存在。

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

您可以在JmxMBeanServer.registerMBean(...)方法中放置一个断点,以查看正在注册的bean,以查看您是否可以找出复制的原因。


另外,我的SimpleJMX库是一种通过JMX导出bean的简单方法。 还有很好的Spring支持。 以下是有关与Spring一起使用的文档。 还有一个Spring测试程序 ,它演示了使其运行所需的操作。 这是Spring XML文件 。

这种情况正在发生,因为即使在初始化一次之后bean也在尝试初始化。

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

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

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

示例 –

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