一、引入quartz相关的jar包
spring-context-support这个提供了MethodInvokingJobDetailFactoryBean和CronTriggerFactoryBean的实现
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
二、编写需要定时任务执行的类及方法(不具体编写,仅提供名称)
类名:ProductSellDailyService
方法名:dailyCalculate
三、定时任务执行配置类(由于springboot是去xml化的,所以是class实现配置)
核心三元素:
Job(任务:定义执行哪个任务,哪个方法)
Trigger(触发器:定义何时触发任务的执行)
Scheduler(调度器:在有多个任务的时候调度调配任务的先后顺序)
package com.imooc.o2o.config.quartz;
import org.springframework.beans.factory.annotation.Autowired;
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;
import com.imooc.o2o.service.ProductSellDailyService;
@Configuration
public class QuartzConfiguration {
@Autowired
private ProductSellDailyService productSellDailyService;
@Autowired
private MethodInvokingJobDetailFactoryBean jobDetailFactory;
@Autowired
private CronTriggerFactoryBean productSellDailyTriggerFactory;
/**
* 创建jobDetailFactory并返回
*
* @return
*/
@Bean(name = "jobDetailFacotry")
public MethodInvokingJobDetailFactoryBean createJobDetail() {
// new出JobDetailFactory对象,此工厂主要用来制作一个jobDetail,即制作一个任务。
// 由于我们所做的定时任务根本上讲其实就是执行一个方法。所以用这个工厂比较方便。
MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();
// 设置jobDetail的名字
jobDetailFactoryBean.setName("product_sell_daily_job");
// 设置jobDetail的组名
jobDetailFactoryBean.setGroup("job_product_sell_daily_group");
// 对于相同的JobDetail,当指定多个Trigger时, 很可能第一个job完成之前,第二个job就开始了。
// 指定concurrent设为false,多个job不会并发运行,第二个job将不会在第一个job完成之前开始。
jobDetailFactoryBean.setConcurrent(false);
// 指定运行任务的类
jobDetailFactoryBean.setTargetObject(productSellDailyService);
// 指定运行任务的方法
jobDetailFactoryBean.setTargetMethod("dailyCalculate");
return jobDetailFactoryBean;
}
/**
* 创建cronTriggerFactory并返回
*
* @return
*/
@Bean("productSellDailyTriggerFactory")
public CronTriggerFactoryBean createProductSellDailyTrigger() {
// 创建triggerFactory实例,用来创建trigger
CronTriggerFactoryBean triggerFactory = new CronTriggerFactoryBean();
// 设置triggerFactory的名字
triggerFactory.setName("product_sell_daily_trigger");
// 设置triggerFactory的组名
triggerFactory.setGroup("job_product_sell_daily_group");
// 绑定jobDetail
triggerFactory.setJobDetail(jobDetailFactory.getObject());
// 设定cron表达式 (https://cron.qqe2.com/)
triggerFactory.setCronExpression("0 0 0 * * ? *");
return triggerFactory;
}
/**
* 创建调度工厂并返回
*
* @return
*/
@Bean("schedulerFactory")
public SchedulerFactoryBean createSchedulerFactory() {
SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
//有多个任务时用逗号隔开
schedulerFactory.setTriggers(productSellDailyTriggerFactory.getObject());
return schedulerFactory;
}
}