как изменить ThreadPoolTaskExecutor во время выполнения через jmx - PullRequest
2 голосов
/ 19 апреля 2011

У меня проблемы с изменением моих свойств MBean через JConsole.У меня есть компонент Threading, который вызывается с:

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 для предоставления ему доступа к методам получения и установки свойств потока, таких как: 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 ]

1 голос
/ 20 апреля 2011

Уменьшение CorePoolSize должно быть достаточно для уменьшения количества активных потоков, но оно вступает в силу только после завершения текущих выполняемых команд.

Остерегайтесь эффекта MaxPoolSize, который может увеличить количество активных потоков, еслиworkQueue заполнен.

Если вам интересно, мы упаковали JMX с поддержкой util.concurrent ThreadPoolExecutor и представили его через простую конфигурацию, основанную на пространстве имен пружин 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 для мониторинга этих пулов потоков.

Thisпоставляется со многими другими дополнениями JMX для упрощения мониторинга общих компонентов (dbcp, util.concurrent, cxf, jms и т. д.) и предлагается в рамках лицензии на программное обеспечение Apache для бизнеса http://code.google.com/p/xebia-france/wiki/XebiaManagementExtras.

Hopeэто помогает,

Сирил

0 голосов
/ 19 апреля 2011

Вам нужен super.setCorePoolSize (corePoolSize);

0 голосов
/ 20 апреля 2011

Если я правильно понимаю, вы инициализируете пул с размером ядра 5, но затем во время выполнения сбрасываете размер пула до 1. Когда вы говорите: " текущий процесс, в котором еще есть 5 потоков TaskExecutor, по-прежнему работают ", это 5 занятых потоков или 5 незанятых потоков?

Если они заняты, сброс размера ядра не вступит в силу, пока 4" лишних "потока не станут свободными.

0 голосов
/ 19 апреля 2011

Используйте super для вызова метода в суперклассе, чтобы избежать бесконечного цикла:

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