Guice and JMX on JBoss

It is very easy to use Guice’s runtime injector bindings to register MBeans on any instance of mbean server. Lets look at a simple example of a HelloMBean. In this example a simple MBean is created and registered on JBoss using google-guice runtime injection.

/**
   * Hello MBean
   */
   public interface HelloMBean{
      public String sayHello(String name);
   }

The implementation of this MBean needs to have a method for the injection of the MBeanServer.

  /**
   * HelloMBean implementation
   */
   import javax.management.JMException;
   import javax.management.MBeanServer;
   import javax.management.ObjectName;
   import com.google.inject.Inject;

   public class Hello implements HelloMBean{
      public String sayHello(String name){
         return "Hello " + name;
      }

      /**
       * This method is used to inject an MBeanServer instance
       * that will be used to register this MBean
       */
      @Inject
      public void register(MBeanServer server){
         try {
             server.registerMBean( this, new ObjectName( "Hello:type=Hello" ) );
         } catch (JMException e) {
             e.printStactTrace();
         }
      }
   }

Now all that needs to be done is creating an Injector with bean and server bindings. The following piece of code can be used in any class (like a Servlet) to register the MBean when the application is deployed or as part of your injection bootstrap.

import javax.management.MBeanServer;
import org.jboss.mx.util.MBeanServerLocator;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.tools.jmx.Manager;
.
.
.
Manager.manage( "ExampleMBean", Guice.createInjector( new AbstractModule() {
    @Override
    protected void configure() {
        // Bind the Jboss MBean server instance
        bind( MBeanServer.class ).toInstance( MBeanServerLocator.locateJBoss() );
        bind( HelloMBean.class ).to( Hello.class ).asEagerSingleton();
    }
} ) );

You can also use “ManagementFactory.getPlatformMBeanServer()” to get/create an MBeanServer. Unfortunately this method cannot be used to get/locate the current JBoss MBeanServer, so “MBeanServerLocator” in the last code snippet above is the only way to locate a JBoss MBean Server instance. After the bean is registered you can use jboss jmx-console or jdk’s jconsole to access the mbean.

Leave a Reply