springboot2.x | 定时任务

简介:基与 springTask进行定时任务

1.启动类添加注解

@EnableScheduling

2.定义一个scheduled服务

@Service
@Slf4j
public class ScheduleTask {
    /**
     * 每5秒执行一次
     */
    @Scheduled(fixedRate = 5000)
    public void task1() {
        log.info("task1");
    }
    /**
     * 每天上午10点,下午2点,4点
     */
    @Scheduled(cron = "0 0 10,14,16 * * ?")
    public void task2() {
        log.info("task2");
    }
}

3.@scheduled() 参数参数详解

fixedRate 定义一个按一定是频率执行任务
fixedDelay 定义一个按一定频率执行的定时任务,与上面不同的是,改属性可以配合initialDelay, 定义该任务延迟执行时间
cron 通过表达式来配置任务执行时间

4.cron 表达式

cron在线生成器
cron博客参考

自定义线程池

从控制台可以看出。多个任务时用的是同一个线程,可以自定义线程池不同的任务用不同线程来执行
启动类添加

@EnableAsync

添加配置

@Configuration
public class ThreadPoolConfig {

    @Bean(name = "asyncThreadPool")
    public ThreadPoolTaskExecutor getAsyncThreadPoolTaskExecutor() {

        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(20);
        taskExecutor.setMaxPoolSize(200);
        taskExecutor.setQueueCapacity(25);
        taskExecutor.setKeepAliveSeconds(200);
        taskExecutor.setThreadNamePrefix("asyncPool-");
        // 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 调度器shutdown被调用时等待当前被调度的任务完成
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        // 等待时长
        taskExecutor.setAwaitTerminationSeconds(60);
        taskExecutor.initialize();
        return taskExecutor;
    }
}

scheduled服务修改为

@Service
@Slf4j
public class ScheduleTask {

   /**
    * 每5秒执行一次
    */
   @Async("asyncThreadPool")
   @Scheduled(fixedRate = 5000)
   public void task1() {
       log.info("task1");
   }


   /**
    * 每天上午10点,下午2点,4点
    */
   @Async("asyncThreadPool")
//    @Scheduled(cron = "0 0 10,15,16 * * ?")
   @Scheduled(fixedRate = 2000)
   public void task2() {
       log.info("task2");
   }
   
}

看控制台输出日志。。。

还有一种是基于Quartz实现定时调度

分布式定时任务解决方案

现在Quartz也有基于Redis的集群方案

  • 分布式锁。可通过使用Redis或者ZooKeeper实现一个分布式锁的机制,使得只有获取到锁的实例方能运行定时任务,避免任务重复执行。可查看下开源的基于Redis实现的分布式锁项目:redisson。github地址:https://github.com/redisson/redisson有兴趣的同学可以了解下。

  • 统一调度中心
    todo

定时任务怎么监控??

todo

springboot-task

你可能感兴趣的:(springboot2.x | 定时任务)