MBean持久性

时间:2012-02-20 10:18:03

标签: java spring jmx jboss5.x

我的配置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)

1 个答案:

答案 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”。
  •