java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot线程池配置类

SpringBoot如何自定义线程池配置类

作者:ABin-阿斌

有时候我们在项目中做一些长链路的跑批任务时,基于Springboot项目的定时任务,我们可以指定一个自定义的线程配置类进行单独提供给具体跑批任务使用,而不占用整个系统资源,这篇文章主要介绍了SpringBoot如何自定义线程池配置类,需要的朋友可以参考下

一、前言

二、案例展示

1、初始版本

@Configuration
@EnableAsync
public class ScheduledConfig {
   /**
     * 创建并配置一个线程池,用于快速执行任务。
     * 
     * @return Executor 返回一个配置好的线程池实例,可以用于快速执行任务。
     */
    @Bean("baseExecutor")
    public Executor fastExecutor() {
        // 创建 ThreadPoolTaskExecutor 实例
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置线程名前缀
        executor.setThreadNamePrefix("xxxx-schedule-baseExecutor");
        // 设置最大线程池大小
        executor.setMaxPoolSize(10);
        // 设置核心线程池大小
        executor.setCorePoolSize(8);
        // 设置队列容量
        executor.setQueueCapacity(5);
        // 设置拒绝执行处理器,采用CallerRunsPolicy策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }

2、代码审核意见和优化建议

3、潜在问题和风险

4、优化建议

5、优化后的代码

@Configuration
@EnableAsync
public class ExecutorConfig {
	// 名字可以根据项目业务随意起
    @Bean("baseExecutor")
    public Executor fastExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 线程名前缀保持不变
        executor.setThreadNamePrefix("xxxx-schedule-base");
        // 调整核心线程池大小、最大线程池大小和队列容量,以适应可能的更高负载
        executor.setCorePoolSize(16); // 增加核心线程数
        executor.setMaxPoolSize(20); // 增加最大线程数
        executor.setQueueCapacity(100); // 增加队列容量
        // 使用自定义的RejectedExecutionHandler来处理任务被拒绝的情况
        executor.setRejectedExecutionHandler(new CustomRejectedExecutionHandler());
        // 确保在应用停止时线程池能被正确关闭
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            executor.shutdown();
        }));
        return executor;
    }
    // 自定义的拒绝执行处理器,以更好地处理任务被拒绝的情况
    static class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            // 这里可以加入更详细的日志记录或发送警报等逻辑
            System.out.println("Task " + r.toString() + " rejected from executor " + executor.toString());
        }
    }
}

三、具体使用

@Async("baseExecutor")
@Scheduled(cron = "0 0/5 * * * ?"){
// 具体业务
}

到此这篇关于SpringBoot如何自定义线程池配置类的文章就介绍到这了,更多相关SpringBoot线程池配置类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文