2010-06-28 5 views
2

J'utilise le @Configuration de Spring, et j'ai remarqué qu'un @Bean n'est pas enregistré avec JMX.Exportation d'objets Spring @Bean à l'aide de JMX

Le haricot est câblé comme

@Bean 
protected CountingHttpInterceptor countingHttpInterceptor() { 

    return new CountingHttpInterceptor(); 
} 

et la définition de la classe est

@ManagedResource 
public class CountingHttpInterceptor implements HttpRequestInterceptor, HttpResponseInterceptor { /* code here*/ } 

Ce fichier @Configuration est traité après le principal, basé sur XML, le contexte d'application est construit, et ne pas la possibilité de participer au processus de découverte qui est activé à l'aide de définitions de beans XML (org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource et frits).

Comment puis-je activer JMX les beans à partir du fichier @Configuration?


Mise à jour: la configuration xml

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

<bean id="jmxAttributeSource" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/> 

<bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler"> 
    <property name="attributeSource" ref="jmxAttributeSource"/> 
</bean> 

<bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy"> 
    <property name="attributeSource" ref="jmxAttributeSource"/> 
</bean> 
+0

Cela devrait bien (il le fait pour moi, au moins). Pouvez-vous poster les parties de votre config XML qui font le travail ici? – skaffman

+0

@skaffman: mise à jour, mais veuillez noter que cette classe @Configuration ne participe pas au contexte d'application XML parent. Au contraire, il est construit en tant que contexte d'application distinct et a le contexte d'application basé sur XML comme parent. Utilisation de Spring 3.0.2.RELEASE. –

Répondre

2

Tout ce que vous avez est correct. Dans votre classe @Configuration, vous devez ajouter une annotation supplémentaire pour exporter vos MBeans, @EnableMBeanExport.

Votre classe de configuration ressemblerait à quelque chose comme ça ...

@Configuration 
@EnableMBeanExport 
public class SpringConfiguration { 
    @Bean 
    protected CountingHttpInterceptor countingHttpInterceptor() { 
     return new CountingHttpInterceptor(); 
    } 
} 
4

Malgré les tentations de la @Configuration - approche fondée sur certaines choses restent mieux fait avec configuration XML. En particulier, la configuration basée sur l'espace de noms, telle que <context:mbean-export>. Ceux-ci représentent essentiellement des "macros" consistant en des arrangements complexes d'objets en interaction.

Maintenant, vous pouvez répliquer cette logique dans votre classe @Configuration, mais c'est vraiment plus de problèmes que cela en vaut la peine. Au lieu de cela, je suggère mettais une telle substance au niveau système en XML et l'importer à partir de votre @Configuration classe:

@ImportResource("/path/to/beans.xml") 
public class MyConfig { 
    @Bean 
    protected CountingHttpInterceptor countingHttpInterceptor() { 
     return new CountingHttpInterceptor(); 
    } 
} 

puis dans /path/to/beans.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans 
      xmlns="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:context="http://www.springframework.org/schema/context" 
      xsi:schemaLocation=" 
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
      "> 

    <context:mbean-export/> 
</beans> 
+1

devrait être 'public class MyConfig {' not 'public lass MyConfig {'. Sinon, merci! :) – Rihards

Questions connexes