MBean持久化

34

我遇到了一个关于持久化配置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;
      }
 }
我的目标是在属性更改后保存状态(保存到文件或元数据,而不是数据库)。在 JBoss 重新启动后,我的 MBean 会使用标准值初始化。似乎 PersistPolicy 不起作用...我尝试实现 PersistentMBean,但 store() 和 load() 从未被调用。我发现这可能是 JBoss JMX 实现问题。还有一些人在 MBean 中使用 AOP 和注释方法来存储它们。所有这些帖子都来自2008-2010年,所以也许有些东西已经改变了吗?
我的 JBoss 配置是默认的(jboss-service.xml)。

你使用的是哪个版本的 JBoss?它支持 persistPolicy 吗? - Tomasz Nurkiewicz
jboss-5.1.0.GA https://community.jboss.org/thread/175100?tstart=0 我一直在搜索 - Jakub C
3
由于某种奇怪的原因,我并不清楚,这个页面https://docs.oracle.com/javase/7/docs/api/javax/management/PersistentMBean.html告诉我onUpdate确实不会调用store()。尝试将其更改为always,看看是否有帮助。(我也非常震惊) - Plínio Pantaleão
1个回答

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

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

[...]

  • OnUpdate - 每次更新属性时都会存储属性。
这很可能是由Sun的PersistMBean Javadoc中非常奇怪的文本引起的(正如@Plínio Pantaleão所指出的)。
如果'persistPolicy'字段为以下任何一项,不要存储MBean: =“never” =“onUpdate” =“onTimer” && now < 'lastPersistTime' + 'persistPeriod'
除了向JBoss报告此问题(以及向Sun报告Javadoc问题)外,您可能可以通过使用JSR160中的“persistPolicy = Always”策略来解决该问题:
始终-这是OnUpdate的同义词,出于兼容性原因而被认可。建议应用程序改用OnUpdate。Descriptor接口的实现(例如DescriptorSupport)可以选择将persistPolicy的“Always”值替换为“OnUpdate”的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接