How can an EJB call an MBean?
Calling an MBean from an EJB in the same JVM is just a matter of
knowing the ObjectName of the MBean you want to call
locating the local MBeansServer
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
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:
Comments