Как получить экземпляр класса привязки 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, и с ней намного легче работать.