Как получить экземпляр класса привязки MBean - PullRequest
2 голосов
/ 07 февраля 2012

Я пытаюсь получить экземпляр класса обслуживания, связанный с 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 ]

3 голосов
/ 07 февраля 2012

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

.... но не удаленно, хотя, только в той же виртуальной машине.

2 голосов
/ 07 февраля 2012

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

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

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

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, и с ней намного проще работать.

...