2

JConsoleを使用してMBeanプロパティを変更できません。次のコマンドで呼び出されるThreadingBeanがあります。

public static void main(String[] args) throws Exception {
    // JMX
    new SimpleJmxAgent();

    // spring executor context
    ApplicationContext ctx = new FileSystemXmlApplicationContext(
            "src/resources/ThreadContent.xml");

    startThreads(ctx);
}

private static void startThreads(ApplicationContext ctx) {

    TaskExecutor tE = (TaskExecutor) ctx.getBean("TaskExecutor");

    System.out.println("Starting threads");

    for (int i = 0; i < 10; i++) {
        tE.execute(new RepeatingGrpPoC());
    }

ThreadContent.xmlには、すべてのデフォルトのプロパティ値が含まれています。

SimpleJmxAgentは次のようになります。

public SimpleJmxAgent() {

    mbs = ManagementFactory.getPlatformMBeanServer();

    // Spring context - used to load MBeans
    XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(
            "resources/JMXcontent.xml"));

    // Unique identification of MBeans
    ThreadPoolManager threadBean = (ThreadPoolManager) factory.getBean("ThreadPoolBean");
    ObjectName threadName = null;

      try {
          // Uniquely identify the MBeans and register them with the platform MBeanServer 
          threadName = new ObjectName("THREADING:name=ThreadBean");
          mbs.registerMBean(threadBean, threadName);
       } catch(Exception e) {
          e.printStackTrace();
       }

ThreadPoolManagerは、次のようなThreadプロパティのgetterメソッドとsetterメソッドにアクセスできるようにするために、ThreadPoolTask​​Executorから継承しています。 public void setCorePoolSize(int corePoolSize)

編集:

私は以下の使用を実装しました:

public void setCorePoolSize(int corePoolSize){
    super.setCorePoolSize(corePoolSize);
}

に包まれて:

    public void changeCorePoolSize(int x){
    setCorePoolSize(x);

}

これで、操作が[MBeans]タブに表示されます。ただし、属性は使用されているものとは異なる値として表示されます。ThreadContext.xmlに設定しました

property name="corePoolSize" value="5"

ただし、表示属性がデフォルト値である1に設定されている場合。操作を介してJconsoleを介してこれを変更できchangeCorePoolSizeますが、表示される値を変更するのは見た目の効果だけですが、5つのTaskExecutor スレッドがまだ進行中の進行中のプロセスは変更しません。

私がしていることに何かが欠けていますか?ThreadContext.xmlを介して設定しているプロパティと、Jconsoleの属性に表示されているプロパティとの間で切断が発生する原因は何ですか?

4

4 に答える 4

1

アクティブなスレッドの数を減らすには、CorePoolSize を減らすだけで十分ですが、現在実行中のコマンドが完了した後にのみ有効になります。

workQueue がいっぱいの場合、アクティブなスレッドの数が増える可能性がある MaxPoolSize の影響に注意してください。

興味がある場合は、JMX 対応の util.concurrent ThreadPoolExecutorをパッケージ化し、単純な Spring XML 名前空間ベースの構成を介して公開します。メトリクス (activeCount、completeTackCount など) とランタイム構成パラメーター (corePoolsize、maxPoolsize) の両方を公開します。次のように宣言するだけです。

<beans 
   xmlns:management="http://www.xebia.fr/schema/xebia-management-extras"
   ... >

   <!-- MBeanExporter is in charge of registering the ExecutorService MBean -->
   <context:mbean-export />

   <management:executor-service 
       id="my-executor" 
       pool-size="1-10" 
       queue-capacity="5"
       keep-alive="5"
       rejection-policy="ABORT" />
   ...
<beans>

ライブラリには、これらのスレッド プールを監視するための JSP ページと Hyperic HQ プラグインが含まれています。

この <executor-service /> は、一般的なコンポーネント (dbcp、util.concurrent、cxf、jms など) の監視を容易にするために、他の多くの JMX エクストラと共にパッケージ化されており、http://code.google のビジネス フレンドリーな Apache ソフトウェア ライセンスの下で提案されています。 .com/p/xebia-france/wiki/XebiaManagementExtras .

お役に立てれば、

シリル

于 2011-04-20T15:55:09.333 に答える
0

super.setCorePoolSize(corePoolSize); が必要です。

于 2011-04-19T16:29:36.587 に答える
0

super無限ループを回避するために、スーパークラスでメソッドを呼び出すために使用します。

public void setCorePoolSize(int corePoolSize){
    super.setCorePoolSize(corePoolSize);
}
于 2011-04-19T16:27:20.180 に答える
0

私の理解が正しければ、コア サイズ 5 でプールを初期化しますが、実行時にプール サイズを 1 にリセットします。スレッド、または 5 つのアイドル スレッド ?

それらがビジーの場合、4 つの「余分な」スレッドがアイドル状態になるまで、コア サイズのリセットは有効になりません。

于 2011-04-20T14:32:50.620 に答える