2012-02-20 15 views
32

Ho un problema con la persistenza del mio MBig di configurazione. La mia configurazione:Persistenza 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; 
     } 
} 

Il mio obiettivo è quello di salvare lo stato dopo un cambio di proprietà (salvare su file o metadati - non dB). Dopo il riavvio di JBoss, il mio MBean viene inizializzato con valori standard. Sembra che PersistPolicy non funzioni ... Ho provato a implementare PersistentMBean, ma store() e load() non sono mai stati richiamati. Ho scoperto che potrebbe trattarsi di un problema di implementazione JBoss JMX. Inoltre alcune persone hanno utilizzato AOP e metodi annotati in MBean per memorizzarli. Tutti questi post erano del 2008-2010, quindi forse qualcosa è cambiato?

mio JBoss config è predefinito (jboss-service.xml)

+0

Quale versione di JBoss stai usando? Supporta 'persistPolicy'? –

+0

jboss-5.1.0.GA https://community.jboss.org/thread/175100?tstart = 0 continuo a cercare –

+2

Per qualche motivo bizzarro non lo so, questa pagina https://docs.oracle.com/javase/7/docs/api/javax/management/PersistentMBean.html mi dice che onUpdate anzi non chiamare store(). Prova a cambiare sempre e vedere se aiuta. (Sono trully anche scioccato) –

risposta

1

Credo che il problema è l'implementazione JBoss di JMX. Secondo JSR160, specificando persistPolicy=OnUpdate per un attributo dovrebbe portare a persistere ogni volta che l'attributo viene aggiornato (da JSR160 1.4):

persistPolicy - definisce la politica di persistenza di default per gli attributi in questo MBean che non definiscono la propria persistPolicy . Prende su uno dei seguenti valori:

[...]

  • OnUpdate - L'attributo viene memorizzato ogni volta che l'attributo viene aggiornato.

E 'probabilmente causato da questo molto strano testo in Javadoc di Sun per PersistMBean (come sottolineato da @Plínio Pantaleão):

Non conservare il MBean se il campo 'persistPolicy' è:

= "mai"

= "onUpdate"

= "timer" & & ora < 'lastPersistTime' + 'persistPeriod'

Oltre segnalato questo a JBoss (e la questione Javadoc al Sole), si può essere in grado di lavorare intorno ad esso utilizzando persistPolicy=Always politica (ancora una volta, da JSR160):

  • sempre - Questo è un sinonimo di OnUpdate, che è riconosciuto per ragioni di compatibilità. Si consiglia invece di utilizzare OnUpdate . Un'implementazione dell'interfaccia Descriptor, come ad esempio DescriptorSupport, può scegliere di sostituire un valore di "Sempre" per persistPolicy con un valore di "OnUpdate".