Как получить экземпляр класса привязки MBean

Я пытаюсь привязать экземпляр класса обслуживания к jboss-service.xml используя MBean.

JBoss-Service.xml определил BasicThreadPool который мы хотим использовать в нашем коде. Это то, что в JBOSS-Service.xml,

  <mbean 
        code="org.jboss.util.threadpool.BasicThreadPool"
        name="jboss.system:service=ThreadPool">

  <attribute name="Name">JBoss System Threads</attribute>
  <attribute name="ThreadGroupName">System Threads</attribute>
  <attribute name="KeepAliveTime">60000</attribute>
  <attribute name="MaximumPoolSize">10</attribute>

  <attribute name="MaximumQueueSize">1000</attribute>
  <!-- The behavior of the pool when a task is added and the queue is full.
  abort - a RuntimeException is thrown
  run - the calling thread executes the task
  wait - the calling thread blocks until the queue has room
  discard - the task is silently discarded without being run
  discardOldest - check to see if a task is about to complete and enque
     the new task if possible, else run the task in the calling thread
  -->
  <attribute name="BlockingMode">run</attribute>
   </mbean>

Я пытаюсь получить доступ к этому в моем коде, как показано ниже,

MBeanServer server = MBeanServerLocator.locateJBoss();          
MBeanInfo mbeaninfo = server.getMBeanInfo(new ObjectName("jboss.system:service=ThreadPool"));

Теперь у меня есть информация MBean. Я хочу иметь экземпляр BasicThreadPool объект, определенный в MBean. Является ли это возможным?

Я знаю способ, которым мы можем получить имя класса из MBean Info, а также мы можем получить атрибуты, по которым мы можем создать экземпляр. Есть ли лучший способ сделать это?

2 ответа

Решение

Как указывалось в 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");

.... но не удаленно, хотя, только в той же ВМ.

Я хочу, чтобы экземпляр объекта BasicThreadPool был определен в MBean. Является ли это возможным?

JMX не работает таким образом. Вместо этого он работает, предоставляя отражающий интерфейс общего назначения, позволяющий вам вызывать операции и атрибуты для любого данного MBean. Это делается через MBeanServerConnection интерфейс (из которых MBeanServer это подтип).

Для вашего примера вы должны получить Name атрибут на jboss.system:service=ThreadPool MBean использует что-то вроде этого:

MBeanServer server = MBeanServerLocator.locateJBoss();      
ObjectName objectName = new ObjectName("jboss.system:service=ThreadPool");    
String threadPoolName = (String) server.getAttribute(objectName , "Name");

Это уродливый API, но делает свою работу.

Если вам интересно, Spring предоставляет очень хорошую абстракцию вокруг JMX, которая повторно предоставляет целевой MBean, используя указанный вами интерфейс Java. Это заставляет все больше походить на нормальную Java, и с ней намного легче работать.

Другие вопросы по тегам