복붙노트

[SPRING] Spring 애플리케이션과 JMX를 통합 할 수 없다.

SPRING

Spring 애플리케이션과 JMX를 통합 할 수 없다.

나는 스프링 응용 프로그램을 가지고있다. 내가 달릴 때.

mvn jetty:run

모든 것은 괜찮습니다.

내 프로젝트에서 JMX를 사용하고 싶습니다.

나는 또 다른 프로젝트를 만들었고 초보자를위한 튜토리얼을 만들었고 jconsole을 사용하여 몇 가지 변화를 볼 수있었습니다.

이제 실제 프로젝트에서 JMX를 사용하고 싶습니다. JMX를 관리하는 SPRING 라이브러리를 사용하고 싶습니다.이 게시물을 따르십시오.

Spring과 JMX를 통합하는 방법?

나는 수업을 가지고있다 :

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)

나는 그것을 디버깅하는 방법조차 모른다.

모든 힌트를 가져 주셔서 감사합니다.

해결법

  1. ==============================

    1.이것은 ObjectName이 bean 인 name = testBean1이 MBeanExporter에 등록되어있는 두 개의 Bean을 가지고 있음을 알려주려고합니다. 그러나 빈 파일 맵에 다른 XML 파일이나 항목이 없으면 안됩니다.

    이것은 ObjectName이 bean 인 name = testBean1이 MBeanExporter에 등록되어있는 두 개의 Bean을 가지고 있음을 알려주려고합니다. 그러나 빈 파일 맵에 다른 XML 파일이나 항목이 없으면 안됩니다.

    JmxMBeanServer.registerMBean (...) 메소드에 중단 점을 두어 복제본을 가져 오는 이유를 알아낼 수 있는지 확인하기 위해 등록 할 Bean을 확인할 수 있습니다.

    옆으로, 내 SimpleJMX 라이브러리는 JMX를 통해 빈을 내보내는 쉬운 방법입니다. 꽤 좋은 봄 지원도 있습니다. 다음은 Spring과 함께 사용하는 방법에 대한 문서입니다. 또한 작동시키기 위해해야 ​​할 일을 보여주는 Spring 테스트 프로그램이 있습니다. 다음은 Spring XML 파일이다.

  2. ==============================

    2.이것은 bean이 초기화 된 후에도 초기화하려고 할 때 발생합니다.

    이것은 bean이 초기화 된 후에도 초기화하려고 할 때 발생합니다.

    나는 Spring TestNG 테스트 케이스에서 RabbitMQ 설정과 동일한 문제에 직면했다.

    @DirtiesContext를 모든 테스트 케이스 클래스의 클래스 레벨 주석으로 사용하십시오.

    이렇게하면 testcontext 클래스가 실행되고 다음 테스트 케이스 클래스에 대해 새 applicationcontext가 만들어지면 applicationcontext가 만들어지고 종료됩니다.

    예 -

    @Test
    @ContextConfiguration(classes = { ApplicationConfig.class })
    @DirtiesContext
    @WebAppConfiguration
    public class ATest extends AbstractTestNGSpringContextTests{
        @BeforeSuite
        public void setup() throws Throwable {
    
        }
        @AfterSuite
        public void teardown() {
    
        }
    }
    
  3. from https://stackoverflow.com/questions/22789428/cannot-integrate-jmx-with-spring-application by cc-by-sa and MIT license