quartz是一个非常强大的任务调度器。我们可能使用它来管理我们的项目,常见的是做业绩统计等等。当然它的功能远不止这些。我们在这里不介绍quartz的原理,下面讲讲如何在springboot中使用quartz。
废话不多说,直接上源码:
首先看一下我们需要利用quartz执行的类和方法
productSellDailyService接口:
/** * 统计日销量的业务逻辑层 */ public interface ProductSellDailyService { //每日定时对店铺的销量进行统计 void dailyCalculate(); }
对应的实现类:
import net.cqwu.collegeo2o.dao.ProductSellDailyMapper; import net.cqwu.collegeo2o.service.ProductSellDailyService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ProductSellDailyServiceImpl implements ProductSellDailyService { private static final Logger log = LoggerFactory.getLogger(ProductSellDailyServiceImpl.class); @Autowired private ProductSellDailyMapper productSellDailyMapper; /** * 调用quartz每日定时对店铺的商品销量进行统计 */ @Override public void dailyCalculate() { log.info("Quartz is running!!"); //调用持久层的方法,每天对店铺的销量进行统计,插入数据库中。 productSellDailyMapper.insertProductSellDaily(); } }
下面是quartz的配置:
import net.cqwu.collegeo2o.service.ProductSellDailyService; 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; /** * 引入quartz (时间调度),按照我们规定的时间执行指定的任务 * */ @Configuration public class QuartzConfiguration { @Autowired private ProductSellDailyService productSellDailyService; @Autowired private MethodInvokingJobDetailFactoryBean jobDetailFactory; @Autowired private CronTriggerFactoryBean productSellDailyFactory; /** * quartz三部曲的第一部,创建jobdetail对象(jobdetail与我们需要执行的事件进行绑定) * @return */ @Bean(name = "jobDetailFactory") public MethodInvokingJobDetailFactoryBean createJobDetail(){ //new出jobDetailFactoryBean对象,此工厂主要用来执着一个jobdetail对象,即制作一个任务, //由于我们所做的任务其本质就是定时执行一个方法,所以用本工厂比较方便 MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean(); //设置jobDetail的名字 jobDetailFactoryBean.setName("product_sell_daily_job"); //设置jobDetail的组 jobDetailFactoryBean.setGroup("product_sell_daily_group"); //对于同一个jobDetail,如果被多个触发器绑定了,那么很有很可能第一个job没执行完成,第二个job就开始了 //设置Concurrent为false可以避免这种情况,即在第一个job未完成之前第二个job不会开始。 jobDetailFactoryBean.setConcurrent(false); //绑定运行任务的类,这里比较关键,我们需要执行的任务都在该类中 jobDetailFactoryBean.setTargetObject(productSellDailyService); //绑定运行任务类中的方法 jobDetailFactoryBean.setTargetMethod("dailyCalculate"); return jobDetailFactoryBean; } /** * quartz三部曲中的第二部,创建触发器,并配置触发器。在触发器中绑定jobDetail * @return */ @Bean(name = "productSellDailyFactory") public CronTriggerFactoryBean createProductSellDailyTrigger(){ CronTriggerFactoryBean triggerFactory = new CronTriggerFactoryBean(); //设置触发器的名字 triggerFactory.setName("product_sell_daily_trigger"); //设置触发器的组 triggerFactory.setGroup("product_sell_daily_group"); //绑定jobDetail triggerFactory.setJobDetail(jobDetailFactory.getObject()); //设置一些自定义参数 // triggerFactory.setJobDataMap(); //设置cron表达式(也可以使用simpltrigger)。即任务执行的时间。 triggerFactory.setCronExpression("0 0 0 * * ? *"); //每天的00:00:00执行任务 return triggerFactory; } /** * 第三部,创建调度工厂,让调度工厂绑定触发器 * @return */ @Bean(name="schedulerFactory") public SchedulerFactoryBean createScheduleFactoryBean(){ SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); //绑定触发器 schedulerFactoryBean.setTriggers(productSellDailyFactory.getObject()); return schedulerFactoryBean; } }
以上就已经配置好了quartz。主要还是核心的三步,第一步:创建jobDetail并绑定需要利用quartz执行的任务、第二步、创建trigger触发器,并绑定jobDetail.第三步、创建schedule并绑定触发器。
这样我们在启动项目的时候,quartz就已经被启动了。然后他会自动在我们规定的时间执行我们规定的业务。当然如果大家对cron表达式不太熟悉可以在百度搜索 cron表达式生成器。