【问题标题】:Exposing ThreadPoolTaskExecutor as MBean in JMX在 JMX 中将 ThreadPoolTask​​Executor 公开为 MBean
【发布时间】:2019-04-30 09:10:39
【问题描述】:

我在 Spring Boot 项目中从 ThreadPoolExecutor 切换到 ThreadPoolTaskExecutor 只是因为根据它的文档:

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

我在我的配置类中创建了一个 ThreadPoolTaskExecutor 的 bean,如下所示:

  @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;
  }

这运行良好并通过 JMX 公开了我的 ThreadPoolTaskExecutor。现在的问题是,因为我正在创建一个新的 MBeanExporter,所以我的其他 ManagedOperations 被覆盖并且不会出现在 JConsole 中。现在我的问题是:

  1. 有没有办法将ThreadPoolTaskExecutor 添加到现有的托管bean。我试过了,但没有成功。
  2. 这是最有效的方法吗?没有任何注释可以放在上面的bean上吗? @ManagedOperation 不适用于方法级别。

【问题讨论】:

    标签: spring spring-boot spring-jmx


    【解决方案1】:

    这是一种方法...

    @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;
    }
    

    它将被引导的导出器提取。

    编辑

    或者,只需覆盖引导的默认自动配置导出器...

    @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;
    }
    

    【讨论】:

    • 感谢您的回答。如果我这样做,我不需要创建 MyExecutor 的对象吗?如果我愿意,我会直接扩展ThreadPoolExecutor。我使用了 spring 的类,因为他们提到它适合 JMX。
    • 是的;您仍然需要将其声明为@Bean。但是你是对的,你可以扩展 TPE,因为 Spring TPTE getter 只是委托给它。 javadocs 中的注释早于 Spring Boot 及其自动配置的基于注释的导出器。但是您可以通过覆盖 Boot 的默认导出器来避免子类化 - 请参阅我的答案的编辑。
    猜你喜欢
    • 2011-08-08
    • 2013-06-20
    • 2015-08-09
    • 2017-03-02
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多