在使用 springmvc 中,一般的定时任务是使用 job 或者 quartz 或者timer来实现,但是使用它们的时候比较麻烦,会在 xml 文件中配置很多,
springboot 的定时任务比较简单。
1、在 application 启动类中使用 @EnableScheduling 注解开启定时任务,会自动扫描,相当于一个开关,把这个开关开完之后,那么只要在相应的任务类中做相应的任务,那么就会被 spring boot 容器扫描到,扫描到后,根据任务定义的时间
会自动运行
@SpringBootApplication @EnableScheduling public class SpringbootredisApplication { public static void main(String[] args) { SpringApplication.run(SpringbootredisApplication.class, args); } }
2 配置组件
package com.cxy.config; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Date; @Component public class TaskTest { @Scheduled(cron = "*/1 * * * * ?") public void po(){ System.out.println(System.currentTimeMillis()); } }
控制台输出
除了支持cron表达式之外还支持:
@Component public class TaskTest { // @Scheduled(cron = "*/1 * * * * ?") // public void po(){ // System.out.println(System.currentTimeMillis()); // } @Scheduled(fixedRate = 1000) public void po(){ System.out.println(System.currentTimeMillis()); } }
执行结果:
fixedRate: 上一次 启动时间点之后 X秒执行一次
fixedDelay: 上一次 结束时间点之后 每X秒执行一次
initialDelay: 第一次延迟 X秒执行,之后按照fixedRate的规则每X秒执行
但是springtask任务在分布式的时候会存在问题:部署多台服务之后,到底哪个服务器执行呢,那么就应该思考代码问题,不管不是timer,还是quatz等都是存在问题的,这种问题可以采用一下来执行:
1 可以选择代码分离进行单台部署,
2 可以选择redis分布式锁,让一台服务拿到相应的key之后去执行
3 使用zookeeper分布式锁获取单个锁,
如果别人问道这个问题,我们应该知道,清晰代码思路,确实我在之前项目是单台tomcat部署的,所有使用的是这个springtask作为定时任务,只是存在如果节点宕机之后就会出现
问题,所以可以去学习分布式任务进行整合,例如xxl-job