Search code examples
springspring-jmx

spring - exposing SimpleMessageListenerContainer created from factory as mbean


Using spring 4. I am creating a

SimpleMessageListenerContainer

from a factory method with

@Configuration @Bean

        @Bean( name = "container" )
        SimpleMessageListenerContainer container(){
...
...

How to expose this instance on JMX? Since @ManagedResource can only be applied on class


Solution

  • @Bean
    public MBeanExporter exporter() {
        MBeanExporter mBeanExporter = new MBeanExporter();
        mBeanExporter.setBeans(
            Collections.singletonMap("myDomain:type=container,name=myContainter", "container"));
        return mBeanExporter;
    }
    

    That will expose all the public methods/attributes. If you wish to limit which are exposed you can use a MethodNameBasedMBeanInfoAssembler:

    @Bean
    public MBeanExporter exporter() {
        MBeanExporter mBeanExporter = new MBeanExporter();
        mBeanExporter.setBeans(
            Collections.singletonMap("myDomain:type=container,name=myContainter", "container"));
        MethodNameBasedMBeanInfoAssembler assembler = new MethodNameBasedMBeanInfoAssembler();
        assembler.setManagedMethods(new String[] { "start", "stop" });
        mBeanExporter.setAssembler(assembler);
        return mBeanExporter;
    }