如何获取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,并且更容易使用。