如何在运行时通过jmx修改ThreadPoolTaskExecutor



我在通过JConsole修改MBean属性时遇到了麻烦。我有一个线程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();
       }

我有ThreadPoolManager继承自ThreadPoolTaskExecutor,以便给它访问线程属性的getter和setter方法,如: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中显示的属性之间的断开?

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

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

如果您感兴趣,我们打包了一个启用JMX的util。并发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 HQ插件来监控这些线程池。

This 与许多其他JMX附加组件打包在一起,以简化对通用组件(dbcp、util)的监视。并发,cxf, jms等),并根据业务友好的Apache软件许可(http://code.google.com/p/xebia-france/wiki/XebiaManagementExtras)提出。

希望有帮助,

Cyrille

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

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

需要super.setCorePoolSize(corePoolSize);

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

如果它们很忙,你的核心大小重置将不会生效,直到4个"超额"线程变为空闲。

相关内容

  • 没有找到相关文章

最新更新