spring scheduled 定时任务

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。