定时任务的本质
把我们原来需要手工去做的事情直接交给系统去做,他可以大大的减少人的工作量,为企业创造更多的价值;
定时任务的使用场景
- 时间驱动:信用卡账单,还款通知
- 批量处理:银行系统夜间跑批(对账、结账、切换系统营业日期)
- 异步/解耦:半个小时打包一次(类似MQ的作用–>登记入库–>打包发送)
补充:Spring Task虽然简单易用但不支持集群部署,所以我们接下来主要介绍Quartz的使用教程
引入依赖(以SpringBoot项目为例)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>2.0.8.RELEASE</version>
</dependency>
1.做什么事情(任务/作业):Job JobDetail(一个任务可以绑定多个触发器)
public class InspectionSchedulerExecute implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//需要执行的任务对象,Jobdetail
JobDetail jobDetail = jobExecutionContext.getJobDetail();
System.out.println("任务一开始执行")
}
}
- 任务以什么样的规律运行:Trigger触发器
public class TaskConfig {
//JobDetail构建任务参数
public static JobDetail setJobDetail(){
JobDetail jobDetail = JobBuilder.newJob(InspectionSchedulerExecute.class)
.withIdentity("job1","group1")
.usingJobData("jobId","1")
.build();
return jobDetail;
}
//Trigger
public static Trigger setTrigger(SheduExchange job){
//判断该任务是否配置开始执行时间(SheduExchange job要执行的任务对象)
if(job.getStartTime()!=null){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
Trigger trigger = null;
try {
date = sdf.parse(job.getStartTime());
trigger = TriggerBuilder.newTrigger()
.withIdentity(job.getId(),job.getTaskName())
.startAt(date)
.withSchedule(cronSchedule(job.getScope(