有时候需用到定时的功能去实现一些功能。比如定时发送一些邮件、发送一些推送等。
这时候需要用到Scheduled注解
先要在启动类中加上@EnableScheduling
注解
创建++Component++
编写schedule方法并打上@Scheduled
注解
比如
/**
* @author dqn
* created at 2018/8/2 - 17:33
*/
@Component
public class TestSchedule {
Logger logger = LoggerFactory.getLogger(TestSchedule.class);
/**
* cron * * * * * *
* 秒 分 时 号 月 星期X
* 0-59 0-59 0-24 1-31 1-12 1-7
* 其实还有一位可以空, 年份,1970-2099
* 定时任务,符合cron表达式的时候触发
*/
@Scheduled(cron = "0 * * * * *")
public void testCommon(){
logger.info("common "+Instant.now().toString());
}
/**
* 在执行完后fixedDelay后执行
*/
@Scheduled(fixedDelay = 1000)
public void testFixDelay(){
logger.info("delay "+Instant.now().toString());
}
/**
* 第一次缓initDelay后执行
* 之后在执行完后fixedDelay后执行
*/
@Scheduled(initialDelay = 1000,fixedDelay = 1000)
public void testInitDelay(){
logger.info("delay "+Instant.now().toString());
}
/**
* 在前一次 开始 执行后fixedRate后执行
*/
@Scheduled(fixedRate = 2000)
public void testRateDelay(){
logger.info("rate "+Instant.now().toString());
}
}
第一种是定时任务,在@Scheduled
中的cron
值加上一个表达式,用来表示在某个时间的形式符合这个表达式时执行方法。
表达式一般是这样的: * * * * * * *
一共7个位置,最后一个可以不填,也就是说++可以++只设置6位。
从左到右按顺序是: 秒、分、时、日、月、周X、年
他们的值分别是:
0 * * * * ?
表示每次秒到0的时候触发,即每分钟触发一次。
0 0 * * * ?
表时每次分到0的,每小时一次,也可以 * 0 * * * *
* * 3 * * ?
表示每天3点执行
* * 3 15 * ?
表示每个月的15号的3点执行。问号表示不确定,或者说都可以,因为星期X和日是冲突的
* * 3 ? * 1
表示每周一的3点执行,相应的,日期是?号
* * 3-5 * * ?
表示每天的3、4、5点都执行, - 表示范围(range)
同时还提供了 3,6,9
表示一个列表值,还有2/10
表示从2开始,每次递增10。
延时有两种,开始后延时、完成后延时
fixedDelay 表示在上一次执行后延时 XX 时间后执行
fixedRate表示在上一次开始执行就计时,在XX时间后执行