8

プログラム/動的にプロトタイプ Bean を作成しています。開始後のこれらの Bean を jmx コンソールに入れたい。それらをどのように区別できますか?Bean を jmx に追加するために注釈を使用していますが、

@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>
4

2 に答える 2

15

実装するだけでこれを行うことができます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());
    }
}
于 2013-03-21T06:09:24.967 に答える
6

これを行うには、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 命名戦略を実装するコードを投稿しました。

そして、次の Spring Bean のようなもの:

<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 名を定義してそれらを一意にし、Spring とうまく連携できるようにします。

于 2012-07-16T14:40:15.700 に答える