我的配置MBean的持久性存在问题。我的配置:
<bean id="adminMBean" class="pl.mobileexperts.catchme.mbeans.AdminSettingsMBean"></bean>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="assembler" ref="assembler" />
<property name="autodetect" value="true" />
<property name="namingStrategy" ref="namingStrategy"/>
</bean>
<bean id="attributeSource" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />
<bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
<property name="attributeSource" ref="attributeSource" />
</bean>
<bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
<property name="attributeSource" ref="attributeSource" />
</bean>
@ManagedResource(objectName = "pl.mobileexperts.catchme:name=adminMBean",
description ="admin settings",
persistPolicy = "OnUpdate",
persistLocation = "c:/", persistName = "adminSettings.jmx")
public class AdminSettingsMBean {
private boolean moderatorModeEnabled;
public AdminSettingsMBean() {
}
@ManagedAttribute(persistPolicy = "OnUpdate")
public boolean isModeratorModeEnabled() {
return moderatorModeEnabled;
}
@ManagedAttribute(persistPolicy = "OnUpdate")
public void setModeratorModeEnabled(boolean moderatorModeEnabled) {
this.moderatorModeEnabled = moderatorModeEnabled;
}
}
我的目标是在属性更改后保存状态(保存到文件或元数据 - 而不是db)。 JBoss重启后,我的MBean初始化为标准值。似乎PersistPolicy无效......我试图实现PersistentMBean,但从未调用store()和load()。我发现它可能是JBoss JMX实现问题。还有一些人在MBean中使用AOP和带注释的方法来存储它们。所有这些帖子都是从2008年到2010年,所以也许有些事情发生了变化?
我的JBoss配置是默认的(jboss-service.xml)
答案 0 :(得分:1)
我认为你的问题是JMX的JBoss实现。根据JSR160,为属性指定persistPolicy=OnUpdate
应该导致每次更新属性时保持不变(来自JSR160 1.4):
persistPolicy - 为此MBean中的属性定义默认持久性策略 那些没有定义自己的persistPolicy。采用以下值之一:
[...]
- OnUpdate - 每次更新属性时都会存储该属性。
这很可能是由Sun的Javadoc中PersistMBean
的这个非常奇怪的文本引起的(正如@Plínio Pantaleão指出的那样):
如果'persistPolicy'字段为:
,请不要存储MBean=“never”
=“onUpdate”
=“onTimer”&amp;&amp;现在&lt; 'lastPersistTime'+'persistPeriod'
除了向JBoss报告此问题(以及向Sun发送Javadoc问题)之外,您可以使用persistPolicy=Always
策略(再次,来自JSR160)解决此问题:
- 始终 - 这是OnUpdate的同义词,可以识别 兼容性原因。建议应用程序使用OnUpdate 代替。 Descriptor接口的实现,例如 DescriptorSupport,可以选择替换“Always”的值 persistPolicy的值为“OnUpdate”。