SpringBoot使用AsyncConfigurer配置异步多线程定时任务

Spring框架中使用AsyncConfigurer配置异步多线程定时任务使用步骤:

  • 启动类配置
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class TestApplication{
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

 

  • 实现AsyncConfigurer接口并配置线程池信息
@Configuration
public class ScheduleAsyncConfig implements WebMvcConfigurer, AsyncConfigurer {

    /**
     * 核心线程数
     */
    private static final int CORE_POOL_SIZE = 10;

    /**
     * 最大线程数
     */
    private static final int MAX_POOL_SIZE = 50;

    /**
     * 队列容量
     */
    private static final int QUEUE_CAPACITY = 50;

    /**
     * 线程空闲时的存活时间
     */
    private static final int KEEP_ALIVE_TIME = 60;

    @Bean
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(CORE_POOL_SIZE);
        executor.setMaxPoolSize(MAX_POOL_SIZE);
        executor.setQueueCapacity(QUEUE_CAPACITY);
        executor.setKeepAliveSeconds(KEEP_ALIVE_TIME);
        executor.setWaitForTasksToCompleteOnShutdown(false);

        // 线程名称前缀
        executor.setThreadNamePrefix("BLUESEA_SUPPORTCENTER_SCHEDULE_-");

        // 拒绝策略
        // AbortPolicy: 默认的拒绝策略,当任务无法被接受时,会抛出RejectedExecutionException异常。这是默认的策略,表明线程池已经饱和,不能接受新的任务
        // CallerRunsPolicy: 策略会将被拒绝的任务交给提交任务的线程来执行。这种策略不会抛出异常,而是将任务回退给调用者,由调用者自行处理。
        // DiscardPolicy: 策略会默默地丢弃无法处理的任务,不抛出异常,也不做任何处理。对于一些不太重要的任务,使用这个策略可能是一种合理的选择
        // DiscardOldestPolicy: 策略会丢弃队列中最老的一个任务,然后尝试重新提交当前任务。
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        executor.initialize();
        return executor;
    }
}

 

  • 创建定时任务

@Slf4j
@Component
@Async
public class GenerateChargesScheduleService {

/**
* @author ningkl
* @since 2024/7/29
*/
@Scheduled(fixedRate = 1000)
public void processChangeSocialExecute() {
log.info("定时任务开始, 开始时间: {}", DateUtil.getCurrentDate("yyyyMMddHHmmss"));
try {
Thread.sleep(3000);
} catch (Exception e) {
log.error("定时任务异常, 错误信息: {}", e.getMessage());
e.printStackTrace();
}
log.info("定时任务结束, 结束时间: {}", DateUtil.getCurrentDate("yyyyMMddHHmmss"));
}

}
 

 

启动服务,打印日志如下

 

 

posted on 2024-10-29 11:22  往事随风、  阅读(153)  评论(0)    收藏  举报

导航