Détails :
Dans le premier tutoriel Superviser une application java avec Spring et JMX (1), nous avons exposé avec Spring un MBean permettant de ré-initialiser un service de configuration sans redémarrer le serveur.
Cependant par défaut Spring expose toutes les propriétés et méthodes publiques du bean. Entre autres la méthode

public void setConfigurationService(ConfigurationService configurationService) { }

Or celle-ci ne doit pas être visible dans la JConsole. Mais elle est nécessaire pour effectuer l'injection du service de configuration.
Nous allons donc utiliser des annotations JDK 5.0 pour restreindre les attributs et méthodes exposées. D'autres méthodes peuvent être utilisées. Pour plus de renseignements, voir Controlling the management interface of your beans


(Les sources du projet sont disponibles en annexe)

1- Modification de l'implémentation du MBean

@ManagedResource(
	objectName="bean:name=configurationServiceMBean2", 
	description="MBean permettant de manager le service de configuration", 
	log=true,
	logFile="jmx.log", currencyTimeLimit=15, persistPolicy="OnUpdate", 
	persistPeriod=200,
	persistLocation="foo", persistName="bar")
public class ConfigurationServiceMBeanImpl implements ConfigurationServiceMBean {
 
	private static Log logger = LogFactory.getLog(ConfigurationServiceMBeanImpl.class);
 
	private ConfigurationService configurationService;
 
	@ManagedOperation(description="Re-initialise le service de configuration")
	public void reInitConfigurationService() {
		logger.info("Debut de la re-initialisation du service de configuration");
		configurationService.init();
		logger.info("Fin de la re-initialisation du service de configuration");
	}
 
	/**
	 * @param configurationService the configurationService to set
	 */
	public void setConfigurationService(ConfigurationService configurationService) {
		this.configurationService = configurationService;
	}
 
}

L'annotation @ManagedOperation permet de spécifier que l'on veut exposer la méthode public void reInitConfigurationService().
La méthode setConfigurationService ne doit pas être exposée. Donc on n'ajoute aucune annotation.
Pour exposer une propriétée, via les getters et setters, on utilisera l'annotation @ManagedAttribute.

2- Modification du fichier applicationContext.xml pour prendre en compte les annotations
La déclaration du MBean est la même :

<!-- MBean permettant d'administrer le Service de configuration -->
<bean id="configurationServiceMBean" class="fr.minimarmotte.projects.mbean.impl.ConfigurationServiceMBeanImpl">
	<property name="configurationService" ref="configurationService" />
</bean>

Le reste doit être modifié.

On va tout d'abord spécifier quelles méta data nous utilisons dans nos classes. Nous avons choisis les annotations JDK 5.0 :

<!-- Meta data utilisées dans les classes : annotations JDK 5.0 -->
<bean id="jmxAttributeSource"
          class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>

Nous déclarons ensuite un assembleur qui va créer une interface à partir de la classe, en utilisant les annotations (pour afficher uniquement les méthodes et attributs que l'on veut exposer) :

<!-- Assembleur qui va créer une interface de management en utilisant les meta data -->
<bean id="assembler"
	class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
	<property name="attributeSource" ref="jmxAttributeSource"/>
</bean>

Puis on définit la stratégie permettant de récupérer le nom du bean à exposer :

<!-- Méthode pour determiner le nom du MBean a exposer : on utilise les annotations -->
<bean id="namingStrategy"
	class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
	<property name="attributeSource" ref="jmxAttributeSource"/>
</bean>

Dans notre cas, on spécifie que le nom du MBean est défini à l'aide des annotations par l'attribut objectName="bean:name=configurationServiceMBean2".

Enfin on déclare notre exporter qui va exposer notre MBean:

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
	<property name="assembler" ref="assembler"/>
	<property name="namingStrategy" ref="namingStrategy"/>
	<property name="autodetect" value="true"/>
</bean>

En mettant la propriété autodetect à true, on indique que l'on souhaite exposer tous les MBeans annotés avec l'annotation @ManagedResource (au lieu d'utiliser une liste de MBean).

3- Test des modifications
On redémarre le serveur. Dans les logs on constate que le nom du MBean exposé est bien configurationServiceMBean2, défini grâce aux annotations.

INFO: Located managed bean 'configurationServiceMBean': registering with JMX server as MBean [bean:name=configurationServiceMBean2]

On lance JConsole et on se connecte. On trouve le MBean configurationServiceMBean2. Et contrairement au premier tutoriel, seule la méthode reInitConfigurationService() est disponible. Les attributs et autres méthodes ne sont pas accéssibles !