Version 3

    How can an EJB call an MBean?

     

    Calling an MBean from an EJB in the same JVM is just a matter of

     

    1. knowing the ObjectName of the MBean you want to call

    2. locating the local MBeansServer

    3. get/set attributes or invoke operation on that MBean

     

    Knowing the ObjectName of the target MBean is application specific.

     

    For locating the MBeanServer look at the answer to this FAQ:

    HowCanIGetAReferenceToTheMBeanServer.

     

    The traditional way to get/set attributes and invoke operations is

    to use the detyped interface of

    MBeanServer,

    in particular the methods:

       interface MBeanServer {
       ...
       Object getAttribute(ObjectName name, String attribute) throws ...
       
       void setAttribute(ObjectName name,  Attribute attribute) throws ...
       
       Object invoke(ObjectName name,
                  String operationName,
                  Object[] params,
                  String[] signature)
                     throws ...
    

     

    Starting with JMX v1.2 (JBoss v3.2.4+) you have an alternative

    way of making type-safe invocations to your target MBean,

    by obtaining a JDK1.3+ dynamic proxy. This is a lot more

    conventient and it doesn't have an impact on performance:

       import javax.management.MBeanServer;
       import javax.management.MBeanServerInvocationHandler;
       import javax.management.ObjectName;
       ...
       // target MBean
       ObjectName  objectName = new ObjectName("mydomain:name=mymbean");
       
       // find the local MBeanServer
       MBeanServer server = ...
    
       // Get a type-safe dynamic proxy
       MyClassMBean mbean =
          (MyClassMBean)MBeanServerInvocationHandler.newProxyInstance(
                                                       server,
                                                       objectName,
                                                       MyClassMBean.class,
                                                       false);
       // Use the proxy
       String state = mbean.getStateString();
       mbean.reset();
    

    Before JMX v1.2 (starting from JBoss v.3.0.0+) you may use the JBoss-specific

    class MBeanProxy to do the same:

       import org.jboss.mx.util.MBeanProxy;
       ...
       MyClassMBean mbean = (MyClassMBean)MBeanProxy.get(
                                                       MyClassMBean.class,
                                                       objectName,
                                                       server);
    

    Then you'll probably cache the proxy reference for future use.

     

    Referenced by: