MBean 持久性

2022-09-01 07:54:39

我的配置MBAan的持久性有问题。我的配置:

<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;
      }
 }

我的目标是在属性更改后保存状态(保存到文件或元数据 - 而不是数据库)。在 JBoss 重新启动后,我的 MBean 将使用标准值进行初始化。似乎 PersistPolicy 不起作用...我试图实现PersistentMBean,但store()和load()从未被调用过。我发现这可能是一个JBoss JMX实现问题。还有一些人在 MBean 中使用 AOP 和带注释的方法来存储它们。所有这些帖子都是从2008年到2010年,所以也许有什么变化?

My JBoss config is default (jboss-service.xml)


答案 1

我认为你的问题是JMX的JBoss实现。根据 JSR160,指定属性应该会导致每次更新属性时都持久化(来自 JSR160 1.4):persistPolicy=OnUpdate

persistPolicy - 为此 MBean 中不定义自己的 persistPolicy 的属性定义默认持久性策略。采用以下值之一:

[...]

  • OnUpdate - 每次更新属性时都会存储该属性。

它很可能是由Sun的Javadoc中这个非常奇怪的文本引起的(正如@Plínio Pantaleão所指出的那样):PersistMBean

如果 “persistPolicy” 字段为:

=“从不”

=“onUpdate”

= “onTimer” && now < 'lastPersistTime' + 'persistPeriod'

除了向 JBoss 报告此问题(以及向 Sun 报告 Javadoc 问题)之外,您还可以使用策略(同样,从 JSR160 中)来解决此问题:persistPolicy=Always

  • 始终 - 这是 OnUpdate 的同义词,出于兼容性原因而识别 OnUpdate。建议应用程序改用 OnUpdate。描述符接口的实现(如 DescriptorSupport)可以选择将 persistPolicy 的值“Always”替换为值“OnUpdate”。

答案 2

推荐