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"));
}
}
启动服务,打印日志如下
浙公网安备 33010602011771号