搭框架的不再赘述,吉特哈贝上很多滴;
在Spring Boot中实现定时任务功能,可以通过Spring自带的定时任务调度,也可以通过集成经典开源组件Quartz实现任务调度。
1、cron表达式方式(适用于重复性的执行,类似于定时器)
使用自带的定时任务,非常简单,只需要像下面这样,加上注解就好,不需要像普通定时任务框架那样继承任何定时处理接口 ,简单示例代码如下:
package com.ai.rai.group.system;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @version 1.0
* @ClassName SpringTaskA
* @Description todo
* @Author 74981
* @Date 2018/8/31 10:44
*/
@Component
@EnableScheduling
public class SpringTaskA {
/**
* CRON表达式参考:http://cron.qqe2.com/
**/
@Scheduled(cron = "0/20 * * * * ? ", zone = "GMT+8:00")
public void timerCorn(){
System.out.println(String.format("(timerCron)%s 每隔20秒执行一次,记录日志", new Date()));
}
}
控制台信息:
2、fixedRate和fixedDelay(适用于固定间隔的触发,比如每隔5分钟触发一次)
package com.ai.rai.group.system;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @version 1.0
* @ClassName SpringTaskB
* @Description todo
* @Author 74981
* @Date 2018/8/31 10:59
*/
@Component
@EnableScheduling
public class SpringTaskB {
/*fixedRate:上一次开始执行时间点之后10秒再执行*/
@Scheduled(fixedRate = 10000)
public void timerFixedRate(){
System.out.println(String.format("(fixedRate)现在时间:%s", new Date()));
}
/*fixedDelay:上一次执行完毕时间点之后8秒再执行*/
@Scheduled(fixedDelay = 8000)
public void timerFixedDelay(){
System.out.println(String.format("(fixedDelay)现在时间:%s", new Date()));
}
/*第一次延迟3秒后执行,之后按fixedDelay的规则每5秒执行一次*/
@Scheduled(initialDelay = 3000,fixedDelay = 5000)
public void timenInitDelay(){
System.out.println(String.format("(initDelay)现在时间:%s", new Date()));
}
}
效果:
注意一下主要区别:
@Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
@Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
@Scheduled(initialDelay=2000, fixedDelay=5000) :第一次延迟2秒后执行,之后按fixedDelay的规则每5秒执行一次
有时候,很多项目我们都需要配置好定时任务后立即执行一次,initialDelay就可以不用配置了。
3、zone
@Scheduled注解还有一个熟悉的属性zone,表示时区,通常,如果不写,定时任务将使用服务器的默认时区;如果你的任务想在特定时区特定时间点跑起来,比如常见的多语言系统可能会定时跑脚本更新数据,就可以设置一个时区,如东八区,就可以设置为:
zone = "GMT+8:00"
Quartz是应用最为广泛的开源任务调度框架之一,有很多公司都根据它实现自己的定时任务管理系统。Quartz提供了最常用的两种定时任务触发器,即SimpleTrigger和CronTrigger,本文以最广泛使用的CronTrigger为例。
添加依赖,这个如果是用IDEA+maven管理的话很方便,
如果不是的话:
加入依赖:
org.quartz-scheduler
quartz
2.3.0
算了,这个用起来太麻烦了,有空再写吧
扩展阅读:
很多公司都会有自己的定时任务调度框架和系统,在Spring Boot中如何整合Quartz集群,实现动态定时任务配置?
http://www.cnblogs.com/vincent0928/p/6294792.html
http://www.cnblogs.com/zhenyuyaodidiao/p/4755649.html