我正在以编程方式/动态方式创建原型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>发布于 2012-07-16 22:40:16
您可以使用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 naming strategy的代码。
然后是类似下面的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 naming的Spring文档,尽管我不能100%确定它涵盖了自定义命名的内容。
另外,我的SimpleJMX package也做了这件事。它使用一个JmxSelfNaming interface,允许对象的每个实例定义自己的bean-name,以使它们唯一,并与Spring很好地配合使用。
发布于 2013-03-21 14:09:25
您只需实现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());
}
}https://stackoverflow.com/questions/11506486
复制相似问题