Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态更改@ManagedResource对象名_Java_Spring_Jmx_Spring 3 - Fatal编程技术网

Java 动态更改@ManagedResource对象名

Java 动态更改@ManagedResource对象名,java,spring,jmx,spring-3,Java,Spring,Jmx,Spring 3,我正在以编程/动态方式创建原型bean。我希望启动后这些bean在jmx控制台中。我怎样才能区分它们呢?我正在使用anotations将我的bean添加到jmx中,我已经 @ManagedResource(objectName="bean:name=MybBean") 我需要动态注入objectName。你知道我怎么做吗 以下是我的jmx配置: <context:mbean-export server="mbeanServer" /> <bean id="mbeanServ

我正在以编程/动态方式创建原型bean。我希望启动后这些bean在jmx控制台中。我怎样才能区分它们呢?我正在使用anotations将我的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>

您可以使用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();
}
我已经发布了代码来实现

然后像下面的春豆:

<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>
下面是关于的Spring文档,尽管我不能100%确定它涵盖了自定义命名的内容


而且,我的朋友也做这件事。它使用了一个允许对象的每个实例定义自己的bean名称的函数,使它们唯一,并与Spring配合使用。

您只需实现:


但是bean名称在类中是硬编码的。。我需要它是动态的,我将在创建instanceSo时设置它。因此,在
getJmxName()
方法中,它可以以编程方式执行任何操作。它可以使用
toString()
方法,也可以吐出任何使它独特的东西。我对答案进行了编辑,以使其更加明显。com.j256.jmx.RuntimeMetadataNamingStrategy我需要获取库eh?这会导致其他错误:未定义名为“0”的bean。我已经编辑了我的mbean在配置文件中的样子,您可能想看看我的SimpleJMX包@hmojica。这很容易使用,并且与
配合良好。在我的例子中,不需要MBeanExporter、Postconstruct和属性
@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" };
    }
}
@Component("MyPrototypeScopedBeanName")
@ManagedResource     
public class MyPrototypeScopedBeanName implements SelfNaming
{
    @Override
    public ObjectName getObjectName() throws MalformedObjectNameException {
        return new ObjectName("com.foobar", "name", this.toString());
    }
}