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

阅读更多
文章标签: quartz java
上一篇短链接的生成之工具类的编写--三种方式(亲测可用)
下一篇idea中运行ssm 或springboot项目时,project Structure的配置
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭