如何在运行时通过jmx修改ThreadPoolTask​​Executor

时间:2011-04-19 16:03:04

标签: java spring threadpool jmx mbeans

我无法通过JConsole修改MBean属性。我有一个Threading bean,调用:

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();
       }

我从ThreadPoolTask​​Executor获取ThreadPoolManager,以便它可以访问Thread属性的getter和setter方法,例如: public void setCorePoolSize(int corePoolSize)

修改

我已经实现了使用:

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

包裹在:

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

}

现在,Operation出现在MBeans选项卡中。但是,属性显示为与正在使用的值不同的值。我在ThreadContext.xml中设置了

property name="corePoolSize" value="5"

但是,当查看属性设置为1时,这是默认值。我可以通过changeCorePoolSize操作通过Jconsole更改此功能,但只有一个修饰效果更改显示的值,但不会更改仍有5个TaskExecutor 线程的正在进行的进程。

我错过了我正在做的事情吗?什么可能导致我通过ThreadContext.xml设置的属性与Jconsole中的属性中显示的属性之间断开连接?

4 个答案:

答案 0 :(得分:1)

减少CorePoolSize应该足以减少活动线程的数量,但只有在当前运行的命令完成后才会生效。

请注意MaxPoolSize的效果,如果workQueue已满,可能会增加活动线程的数量。

如果您感兴趣,我们打包JMX enabled util.concurrent ThreadPoolExecutor并通过简单的基于Spring命名空间的简单配置公开它。它公开了指标(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 HQ插件。

此&lt; executor-service /&gt;与许多其他JMX附加程序一起打包,以便于监视常见组件(dbcp,util.concurrent,cxf,jms等),并在http://code.google.com/p/xebia-france/wiki/XebiaManagementExtras的商业友好Apache软件许可证下提出。

希望这有帮助,

西里尔

答案 1 :(得分:0)

使用super调用超类中的方法,以避免无限循环:

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

答案 2 :(得分:0)

你需要super.setCorePoolSize(corePoolSize);

答案 3 :(得分:0)

如果我理解正确,你初始化池的核心大小为5,但是在运行时,将池大小重置为1.当你说“正在进行的进程仍有5个TaskExecutor线程仍在运行时“,是5个忙线程,还是5个空闲线程?

如果它们很忙,那么核心大小重置将不会生效,直到4个“多余”线程变为空闲。