2011-04-19 107 views
2

我無法通過JConsole的修改我的MBean屬性修改ThreadPoolTask​​Executor類在運行時。我有一個調用的Threading bean:如何通過JMX

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從ThreadPoolTask​​Executor類inherting爲了給它訪問線程屬性的getter和setter方法,如: public void setCorePoolSize(int corePoolSize)

編輯:

我已經實施了使用:

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

裹着:

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

} 

所以現在的操作中出現的MBean標籤。然而,屬性顯示爲與正在使用的值不同的值。我已經在我的ThreadContext.xml中設置了

property name="corePoolSize" value="5" 

但是,當查看屬性設置爲1(默認值)時。我可以通過changeCorePoolSize操作通過Jconsole更改此操作,但只會改變所顯示的值的美觀效果,但不會更改仍在執行的正在進行的過程。

我失去了在我在做什麼東西嗎?什麼可能導致我通過ThreadContext.xml設置的屬性和顯示在Jconsole屬性中的屬性之間的斷開?

回答

1

減小CorePoolSize應該足以降低活動線程的數量,而是隻完成當前正在運行的命令後生效。

當心MaxPoolSize至極的效果可能適當增加活動線程的數目,如果工作隊列是滿的。

如果你有興趣,我們打包一個JMX enabled util.concurrent ThreadPoolExecutor,並通過一個簡單的Spring XML命名空間基於配置揭露它。它公開了兩個度量標準(activeCount,completedTackCount等)和運行時配置參數(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公司總部插件監視這些線程池。

這<執行服務/ >包裝與許多其他JMX額外緩解通用組件(DBCP,util.concurrent程序,CXF,JMS等),並在http://code.google.com/p/xebia-france/wiki/XebiaManagementExtras的營商Apache軟件許可證下提出的監控。

希望這有助於

西里爾

0

使用super調用的方法在超類,避免無限循環:

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

你需要super.setCorePoolSize(corePoolSize);

0

如果我理解正確,您初始化核心大小爲5的池,但在運行時重置池大小爲1.當您說,「仍然有5個TaskExecutor線程仍在進行的進程 「,是5個忙線程還是5個空閒線程?

如果他們很忙,你磁芯尺寸復位不會生效,直到4「過剩」的線程空閒。

+0

您好尼古拉, 我不復位的情況下運行。這只是當我檢查它在Jconsole上的值是1時的值。我認爲這是默認值。在Jconsole中可以觀察到5個TaskExecutor線程實例。那爲什麼不顯示5而不是1? – Will 2011-04-21 08:39:53