如何获取MBean绑定类实例
我试图使用MBean获取绑定在jboss-service.xml
中的服务类的实例。
JBoss-Service.xml
定义了一个我们想在代码中使用它的BasicThreadPool
。 这就是JBOSS-Service.xml
。
JBoss System Threads System Threads 60000 10 1000 run
我试图在我的代码中访问它,如下所示,
MBeanServer server = MBeanServerLocator.locateJBoss(); MBeanInfo mbeaninfo = server.getMBeanInfo(new ObjectName("jboss.system:service=ThreadPool"));
现在我有MBean信息。 我想在MBean中定义一个BasicThreadPool
对象的实例。 可能吗 ?
我知道一种方法,我们可以从MBean Info中获取类名,我们也可以获取构造实例的属性。 有没有更好的方法呢?
正如skaffman指出的那样,你无法直接获取线程池的直接实例,但使用MBeanServerInvocationHandler会让你非常接近。
import org.jboss.util.threadpool.BasicThreadPoolMBean; import javax.management.MBeanServerInvocationHandler; import javax.management.ObjectName; ..... BasicThreadPoolMBean threadPool = (BasicThreadPoolMBean)MBeanServerInvocationHandler.newProxyInstance(MBeanServerLocator.locateJBoss(); new ObjectName("jboss.system:service=ThreadPool"), BasicThreadPoolMBean.class, false);
该示例中的threadPool实例现在实现了底层线程池服务的所有方法。
请注意,如果您只需要它来提交执行任务,那么您只需要一件事,那就是Instance属性[几乎]是相同的界面,所以您也可以这样做:
import org.jboss.util.threadpool.ThreadPool; import javax.management.ObjectName; ..... ThreadPool threadPool = (ThreadPool)MBeanServerLocator.locateJBoss().getAttribute(new ObjectName("jboss.system:service=ThreadPool"), "Instance");
….但不是远程,只能在同一个VM中。
我想在MBean中定义一个BasicThreadPool对象的实例。 可能吗 ?
JMX不会那样工作。 相反,它通过公开通用reflection接口来工作,允许您在任何给定的MBean上调用操作和属性。 这是通过MBeanServerConnection
接口(其中MBeanServer
是子类型)完成的。
对于您的示例,您将使用以下内容获取jboss.system:service=ThreadPool
MBean上的Name
属性:
MBeanServer server = MBeanServerLocator.locateJBoss(); ObjectName objectName = new ObjectName("jboss.system:service=ThreadPool"); String threadPoolName = (String) server.getAttribute(objectName , "Name");
这是一个丑陋的API,但做的工作。
如果您感兴趣,Spring会围绕JMX提供一个非常好的抽象,它使用您指定的Java接口重新公开目标MBean 。 这使得一切感觉更像普通的Java,并且更容易使用。