在日常项目运行中,我们总会有需求在某一时间段周期性的执行某个动作。比如每天在某个时间段导出报表,或者每隔多久统计一次现在在线的用户量。在springboot中可以有很多方案去帮我们完成定时器的工作,有Java自带的java.util.Timer类,也有强大的调度器Quartz,还有SpringBoot自带的Scheduled,今天主要说说Scheduled。
定时器比较
框架名称 | Cron表达式 | 固定间隔执行 | 固定频率执行 | 任务持久化 | 难易度 |
---|---|---|---|---|---|
TimerTask | 不支持 | 支持 | 支持 | 不支持 | 一般 |
schedule | 支持 | 支持 | 支持 | 不支持 | 简单 |
Quartz | 支持 | 支持 | 支持 | 支持 | 难 |
在实际应用中,如果没有分布式场景(quartz 支持分布式, schedule 不支持(需要自己实现,用分布式锁),schedule跟spring结合的更好,还是很适用的。
创建schedule工程
使用IntelliJ IDEA创建helloschedule
点击finish完成项目的创建。
为了方便演示,使用@Slf4j输出日志,添加lombok引用,@Slf4j不清楚的可以看看SpringBoot(八)配置logback日志
添加export类。
package com.task.log;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by toutou on 2018/10/20.
*/
@Component
@Slf4j
public class export {
@Scheduled(cron = "0 0/1 * * * ?")
public void minuteExport(){
log.debug("每分钟执行一次的任务:" + getDate());
}
@Scheduled(fixedRate = 5000)
public void fiveSecondExport(){
log.debug("每5秒执行一次:" + getDate());
}
@Scheduled(cron = "0/2 * * * * ?")
public void twoSecondExport(){
log.debug("每2秒执行一次:" + getDate());
}
@Scheduled(cron = "0 55 14 ? * *")
public void regularTimeExport(){
log.debug("每天上午14点55分执行:" + getDate());
}
private String getDate(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date());
}
}
启动类中添加@EnableScheduling
注解,然后运行。
查看IntelliJ IDEA控制台日志和物理文件日志
如上图,简单的定时任务输出日志搭建完成。