복붙노트

[SPRING] @ManagedResource objectName을 동적으로 변경하십시오

SPRING

@ManagedResource objectName을 동적으로 변경하십시오

프로토 타입 bean을 프로그래밍 방식으로 / 동적으로 작성하고 있습니다. 초기화 후에 해당 콩을 jmx 콘솔에 넣기를 원합니다. 어떻게 구분할 수 있습니까? jmx에 콩을 추가하기 위해 anotations를 사용하고 있습니다.

@ManagedResource(objectName="bean:name=MybBean")

objectName을 동적으로 주입해야합니다. 어떤 생각이라도 어떻게 할 수 있니?

내 jmx 구성은 다음과 같습니다.

<context:mbean-export server="mbeanServer" />

<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean" />

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
        lazy-init="false">

        <property name="beans">
            <map>
                <entry key="Server:name=HttpAdaptor">
                    <bean class="mx4j.tools.adaptor.http.HttpAdaptor">
                        <property name="port" value="8000" />
                        <property name="host" value="0.0.0.0" />
                        <property name="processor">
                            <bean class="mx4j.tools.adaptor.http.XSLTProcessor" />
                        </property>

                    </bean>
                </entry>                
            </map>
        </property>
        <property name="listeners">
            <list>
                <!--

                -->
                <bean class="com.fixgw.jmx.HttpAdaptorMgr">
                    <property name="mbeanServer" ref="mbeanServer" />
                </bean>
            </list>
        </property>
    </bean>

   <bean id="sessionMDB" class="com.fixgw.mdb.SessionMDB"
        scope="prototype" lazy-init="true">
        <constructor-arg ref="0" />
        <constructor-arg ref="0" />
    </bean>

해결법

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

    1.이를 위해 JMX 명명 전략을 사용할 수 있습니다. 직장에서 우리는 인터페이스를 사용합니다 :

    이를 위해 JMX 명명 전략을 사용할 수 있습니다. 직장에서 우리는 인터페이스를 사용합니다 :

    public interface RuntimeJmxNames {
        /** this is the name= part of the object name */
        public String getJmxName();
        /** this sets the folders as 00=FirstFolder,01=Second */
        public String[] getJmxPath();
    }
    

    RuntimeMetadataNamingStrategy 명명 전략을 구현하기위한 코드를 게시했습니다.

    그리고 나서 다음과 같은 스프링 빈과 같은 것 :

    <bean id="jmxAttributeSource"
     class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />
    
    <bean id="jmxAssembler"
        class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
        <property name="attributeSource" ref="jmxAttributeSource" />
    </bean>
    
    <bean id="jmxNamingStrategy" class="com.j256.jmx.RuntimeMetadataNamingStrategy">
        <property name="attributeSource" ref="jmxAttributeSource" />
    </bean>
    
    <bean id="mbeanExporter" class="org.springframework.jmx.export.MBeanExporter">
        <property name="autodetect" value="true" />
        <property name="assembler" ref="jmxAssembler" />
        <property name="namingStrategy" ref="jmxNamingStrategy" />
        <property name="ensureUniqueRuntimeObjectNames" value="false" />
        <property name="excludedBeans" ref="excludedJmxBeans" />
    </bean>
    

    코드에서 다음과 같은 작업을 수행합니다.

    @ManagedResource(objectName = "foo.com:name=replaced", description = "...")
    public class Foo implements RuntimeJmxNames {
        ...
        public String getJmxName() {
            // here's where you can make the name be dynamic
            return toString();
        }
        @Override
        public String[] getJmxPath() {
            return new String[] { "folder" };
        }
    }
    

    JMX 네이밍에 대한 Spring의 문서는 여기에 있습니다 만, 커스텀 네이밍을 다루는 것이 100 % 확실하지는 않습니다.

    또한, 내 SimpleJMX 패키지는 이것을 수행합니다. 그것은 JmxSelfNaming 인터페이스를 사용하여 객체의 각 인스턴스가 고유 한 bean-name을 정의하여 고유하게 만들고 Spring과 잘 작동하도록합니다.

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

    2.org.springframework.jmx.export.naming.SelfNaming을 구현하면됩니다.

    org.springframework.jmx.export.naming.SelfNaming을 구현하면됩니다.

    @Component("MyPrototypeScopedBeanName")
    @ManagedResource     
    public class MyPrototypeScopedBeanName implements SelfNaming
    {
        @Override
        public ObjectName getObjectName() throws MalformedObjectNameException {
            return new ObjectName("com.foobar", "name", this.toString());
        }
    }
    
  3. from https://stackoverflow.com/questions/11506486/change-managedresource-objectname-dynamically by cc-by-sa and MIT license