Предоставление ThreadPoolTaskExecutor как MBean в JMX - PullRequest
0 голосов
/ 28 ноября 2018

Я переключился с ThreadPoolExecutor на ThreadPoolTaskExecutor в своем проекте Spring Boot только потому, что согласно его документации:

This class is well suited for management and monitoring (e.g. through JMX)

Я создал компонент ThreadPoolTaskExecutor в своем классе конфигурациикак это:

  @Bean
  ThreadPoolTaskExecutor profileTaskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setThreadGroupName(getClass().getSimpleName());
    taskExecutor.setCorePoolSize(corePoolSize);
    taskExecutor.setMaxPoolSize(maxPoolSize);
    taskExecutor.setKeepAliveSeconds(KEEP_ALIVE_MINUTES);
    taskExecutor.setQueueCapacity(1);
    taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
    return taskExecutor;
  }

  @Bean
  protected MBeanExporter mbeanExporter() {
    MBeanExporter exporter = new MBeanExporter();
    Map<String, Object> beans = new HashMap<>();
    beans.put("org.springframework.boot:type=Executors,name=ProfileServiceExecutor", profileTaskExecutor());
    exporter.setBeans(beans);
    return exporter;
  }

Это работает нормально и выставляет мой ThreadPoolTaskExecutor через JMX.Теперь проблема в том, что, поскольку я создаю новый MBeanExporter, мои другие ManagedOperations переопределяются и не отображаются в JConsole.Теперь мой вопрос:

  1. Есть ли способ добавить ThreadPoolTaskExecutor к существующим управляемым bean-компонентам.Я пытался, но не смог.
  2. Это самый эффективный способ сделать это?Есть ли какая-нибудь аннотация, которую я могу поставить над бобом?@ManagedOperation не работает на уровне метода.

1 Ответ

0 голосов
/ 28 ноября 2018

Вот один из способов ...

@ManagedResource
public class MyExecutor extends ThreadPoolTaskExecutor {

    private static final long serialVersionUID = 1L;

    @ManagedAttribute
    @Override
    public int getCorePoolSize() {
        return super.getCorePoolSize();
    }

    @ManagedAttribute
    @Override
    public int getMaxPoolSize() {
        return super.getMaxPoolSize();
    }

    @ManagedAttribute
    @Override
    public int getKeepAliveSeconds() {
        return super.getKeepAliveSeconds();
    }

    @ManagedAttribute
    @Override
    public int getPoolSize() {
        return super.getPoolSize();
    }

    @ManagedAttribute
    @Override
    public int getActiveCount() {
        return super.getActiveCount();
    }

}

и

@Bean
MyExecutor exec() {
    MyExecutor taskExecutor = new MyExecutor();
    taskExecutor.setThreadGroupName(getClass().getSimpleName());
    taskExecutor.setCorePoolSize(10);
    taskExecutor.setMaxPoolSize(20);
    taskExecutor.setKeepAliveSeconds(5);
    taskExecutor.setQueueCapacity(1);
    taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
    return taskExecutor;
}

Он будет получен экспортером ботинка.

EDIT

Или просто переопределить автоматически настроенный экспортер загрузки по умолчанию ...

@Bean
@Primary
public AnnotationMBeanExporter mbeanExporter(ObjectNamingStrategy namingStrategy,
        Environment environment, BeanFactory beanFactory) {

    AnnotationMBeanExporter exporter = new AnnotationMBeanExporter();
    exporter.setRegistrationPolicy(RegistrationPolicy.FAIL_ON_EXISTING);
    exporter.setNamingStrategy(namingStrategy);
    String serverBean = environment.getProperty("spring.jmx.server",
            "mbeanServer");
    if (StringUtils.hasLength(serverBean)) {
        exporter.setServer(beanFactory.getBean(serverBean, MBeanServer.class));
    }
    Map<String, Object> beans = new HashMap<>();
    beans.put("org.springframework.boot:type=Executors,name=ProfileServiceExecutor", profileTaskExecutor());
    exporter.setBeans(beans);
    return exporter;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...