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

     

  • 相关阅读:
    BZOJ 2034 【2009国家集训队】 最大收益
    vijos P1780 【NOIP2012】 开车旅行
    BZOJ 2115 【WC2011】 Xor
    BZOJ 3631 【JLOI2014】 松鼠的新家
    BZOJ 4717 改装
    BZOJ 2957 楼房重建
    BZOJ 4034 【HAOI2015】 T2
    BZOJ 1834 【ZJOI2010】 network 网络扩容
    BZOJ 2440 【中山市选2011】 完全平方数
    BZOJ 2733 【HNOI2012】 永无乡
  • 原文地址:https://www.cnblogs.com/devise/p/9974681.html
Copyright © 2020-2023  润新知