Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:
大部分公司都会用到定时任务这个功能。
拿火车票购票来说,当你下单后,后台就会插入一条待支付的task(job),一般是30分钟,超过10min后就会执行这个job,去判断你是否支付,未支付就会取消此次订单;当你支付完成之后,后台拿到支付回调后就会再插入一条待消费的task(job),Job触发日期为火车票上的出发日期,超过这个时间就会执行这个job,判断是否使用等。
在我们实际的项目中,当Job过多的时候,肯定不能人工去操作,这时候就需要一个任务调度框架,帮我们自动去执行这些程序。那么该如何实现这个功能呢?
我们需要定义实现一个定时功能的接口,我们可以称之为Task(或Job),如定时发送邮件的task(Job),重启机器的task(Job),优惠券到期发送短信提醒的task(Job)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
@Component
public class IcanJobDemo {
public void printTime() {
System.out.println("现在时刻:"+new Date());
}
}
/*
* Copyright (c) 2020, 2024, fpl1116.cn All rights reserved.
*
*/
package cn.fpl.config;
import cn.fpl.job.IcanJobDemo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
/**
* <p>Project: ICan_ParentWork - QuartzConfig</p>
* <p>Powered by fpl1116 On 2024-01-23 09:54:39</p>
* <p>描述:<p>
*
* @author penglei
* @version 1.0
* @since 1.8
*/
@Configuration
public class QuartzConfig {
@Bean
public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(IcanJobDemo icanJobDemo){
MethodInvokingJobDetailFactoryBean JobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();
JobDetailFactoryBean.setTargetMethod("printTime");
JobDetailFactoryBean.setTargetObject(icanJobDemo);
return JobDetailFactoryBean;
}
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(MethodInvokingJobDetailFactoryBean jobDetailFactoryBean){
CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
cronTriggerFactoryBean.setCronExpression("*/1 * * * * ?");
cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
return cronTriggerFactoryBean;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setTriggers(cronTriggerFactoryBean.getObject());
return schedulerFactoryBean;
}
}
@SpringBootApplication
public class IcanJobApp {
public static void main(String[] args) {
SpringApplication.run(IcanJobApp.class,args);
}
}