4

jboss-service.xmlMBeanを使用してバインドされたサービスクラスのインスタンスを取得しようとしています。

JBoss-Service.xmlBasicThreadPoolコードで使用するを定義しました。これはそれが何であるかです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情報が得られました。BasicThreadPoolMBeanで定義されたオブジェクトのインスタンスが必要です。出来ますか ?

私は方法を知っています。MBean情報からクラス名を取得できます。また、インスタンスを構築するための属性を取得することもできます。それを行うためのより良い方法はありますか?

4

2 に答える 2

4

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インスタンスは、基盤となるスレッドプールサービスのすべてのメソッドを実装するようになりました。

実行のためにタスクを送信するためだけに必要な場合は、必要なものは1つだけです。それは、[ほぼ]同じインターフェイスである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内でのみ。

于 2012-02-07T18:56:54.457 に答える
3

BasicThreadPoolオブジェクトのインスタンスをMBeanで定義したいと思います。出来ますか ?

JMXはそのようには機能しません。代わりに、任意のMBeanで操作と属性を呼び出すことができる汎用リフレクティブインターフェイスを公開することで機能します。MBeanServerConnectionこれは、インターフェース(MBeanServerサブタイプ)を介して行われます。

たとえば、次のようなものを使用してMBeanのName属性をフェッチします。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は、指定したJavaインターフェースを使用してターゲットMBeanを再公開するJMXに関する非常に優れた抽象化を提供します。これにより、すべてが通常のJavaのように感じられ、操作がはるかに簡単になります。

于 2012-02-07T14:17:12.967 に答える