在springboot项目中引入quartz任务调度器。

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表达式生成器。

 

posted @ 2018-04-15 17:30  宇宙间的星河集  阅读(799)  评论(0编辑  收藏  举报