spring scheduled 定时任务
-
启动类注解:@EnableScheduling
-
定时方法: @Scheduled(cron = “0/30 * * * * ?”)
-
cron 表达式
序号 | 说明 | 是否必填 | 允许填写的值 | 允许的通配符 |
---|---|---|---|---|
1 | 秒 | Y | 0-59 | , – * / |
2 | 分 | Y | 0-59 | , – * / |
3 | 时 | Y | 0-23 | , – * / |
4 | 日 | Y | 1-31 | , – * / L |
5 | 月 | Y | 1-12 | , – * ? / L W |
6 | 周 | Y | 1-7 | , – * ? / L # |
7 | 年 | N | , – * / |
[ , ] 列举多个值
[ - ] 区间
[ * ] 任意值
[ / ] 递增
[ L ] 表示最后,第四位是月中最后一天,第六位是周六
[ W ] 离指定日期的最近那个工作日(周一到周五) 如 15W
[ # ] 表示每月的第几个周几 6#3 第三个周六
-
线程池默认单线程。所有的scheduled注解方法争夺一个线程执行
-
多线程配置方案1
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
}
}
-
多线程配置方案2,和@Async配合使用
- 启动类注解:@EnableAsync
- 配置@Scheduled 和@Async
- 线程池配置: IO密集多线程少队列,cpu密集cpu线程数量多队列
@Scheduled(cron = "0/30 * * * * ?")
@Async
public void scheduledTrainOnceReportLog() {
logger.info("{threadId:{}}", Thread.currentThread().getId());
logger.info("go");
}
@Value("${scheduled.pool.maxSize}")
private Integer maxSize;
@Value("${scheduled.pool.coreSize}")
private Integer coreSize;
@Value("${scheduled.pool.queueCapacity}")
private Integer queueCapacity;
@Bean("scheduledPool")
public AsyncTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setMaxPoolSize(maxSize);
taskExecutor.setCorePoolSize(coreSize);
taskExecutor.setThreadNamePrefix("schedled-pool");
taskExecutor.setQueueCapacity(-1);
taskExecutor.initialize();
return taskExecutor;
}
版权声明:本文为lljksven原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。