很多项目中都会遇到需要定时任务的情况,本篇文章就结合了Spring中以及SpringBoot、SpringCloud中定时任务的解决方案。
用SpringBoot比较多的同学可能都会觉得Spring的xml配置确实比较麻烦,如果想在Spring中使用定时器的话其实是必须使用xml配置文件的。
http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.0.xsd
<task:scheduler id="Scheduler" pool-size="10"/> <task:annotation-driven scheduler="Scheduler" proxy-target-class="true"/>
在项目中使用时定时任务的类必须由Spring来管理,所以我们给这个类加上一个@Component注解
@Componentpublic class Task {
/** *每分钟执行一次 */ @Scheduled(cron = "0 0/1 * * * ?") public void test(){ System.out.println("task定时任务"); } }
@Scheduled注解呢,就是表示启用定时任务,括号里的cron的值呢,其实就是一种表达式,就像上边的例子呢就是表示每分钟执行一次。(文章最后会有cron的详细用法介绍哦)
在SpringBoot中使用的话相比较于Spring中就简单明了多了,一起来看一下吧。
@Componentpublic class Task { /** *每分钟执行一次 */ @Scheduled(cron = "0 0/1 * * * ?") public void test(){ System.out.println("task定时任务"); } }
有的时候我们的定时任务可能几个小时需要执行一次。但是呢,我们可能会需要一些初始值。(假如说我们需要一些缓存,不想每次查询缓存都去判断的话我们就可以先在项目启动时就查询出来,然后定时刷新)如果把这个值的初始化过程放在类的构造方法中感觉岂不是太low了,那么有没有别的办法呢?
@PostConstruct注解,这个注解呢,可以在Spring加载这个类的时候执行一次,完美的解决我们上方所说的问题
@Componentpublic class Task { private int num; private Random rand = new Random(); /** *每分钟执行一次 */ @Scheduled(cron = "0 0/1 * * * ?") public void test(){ System.out.println("task定时任务"); } @PostConstruct private void init(){ changeNum(); } private void changeNum(){ //假装这是个查询数据库的操作 num=rand.nextInt(100); } }
来看一下如何使用cron表达式如何使用的吧
语法
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。 按顺序依次为
demo 注意下方*之间有空格
“0 0 1 ? ** ” 每天凌晨1点触发
“0 30 1 ? ** ” 每天凌晨1:30触发
“30 30 1 ? ** ” 每天凌晨1:30:30触发
“30 30 1 ** ? 2018” 2018年的每天凌晨1:30:30触发
“0 0/1 *** ?” 每分钟触发 一次
“0 0 0/1 ** ?” 每小时触发一次
“0 15 10 ? * MON-FRI” 周一到周五的10:15触发