首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态更改@ManagedResource objectName

动态更改@ManagedResource objectName
EN

Stack Overflow用户
提问于 2012-07-16 22:30:43
回答 2查看 8.4K关注 0票数 8

我正在以编程方式/动态方式创建原型bean。我希望那些初始化后的bean在jmx控制台中。我该如何区分它们呢?我使用anotations来将我的bean添加到jmx中,并且我已经

代码语言:javascript
复制
@ManagedResource(objectName="bean:name=MybBean")

我需要动态注入objectName。你知道我该怎么做吗?

下面是我的jmx配置:

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-16 22:40:16

您可以使用JMX命名策略来实现这一点。在工作中,我们使用一个接口:

代码语言:javascript
复制
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 naming strategy的代码。

然后是类似下面的Spring bean:

代码语言:javascript
复制
<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>

在你的代码中,你可以这样做:

代码语言:javascript
复制
@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 naming的Spring文档,尽管我不能100%确定它涵盖了自定义命名的内容。

另外,我的SimpleJMX package也做了这件事。它使用一个JmxSelfNaming interface,允许对象的每个实例定义自己的bean-name,以使它们唯一,并与Spring很好地配合使用。

票数 6
EN

Stack Overflow用户

发布于 2013-03-21 14:09:25

您只需实现org.springframework.jmx.export.naming.SelfNaming即可完成此操作

代码语言:javascript
复制
@Component("MyPrototypeScopedBeanName")
@ManagedResource     
public class MyPrototypeScopedBeanName implements SelfNaming
{
    @Override
    public ObjectName getObjectName() throws MalformedObjectNameException {
        return new ObjectName("com.foobar", "name", this.toString());
    }
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11506486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档