spring boot 整合quartz

引入jar 

<!--引入定时任务-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

1.配置信息

package com.qdwy.qudaowuyoutask.util.quartz;

import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.context.annotation.Configuration;

import java.util.Date;

/**
 * @Author zbf
 * @DATA 2019/11/21 15:40
 * @ClassIntroduction
 */

@Slf4j
@Configuration
public class QuartzConfig {
    /**
     * 任务调度
     */
    private static Scheduler scheduler=null;




    public QuartzConfig() {
        try {
            scheduler = new StdSchedulerFactory().getScheduler();
            log.info("初始化调度器 ");
        } catch (SchedulerException ex) {
            log.error("初始化调度器=> [失败]:" + ex.getLocalizedMessage());
        }

    }

    /**
     * 启动定时任务
     */
    public void start() {
        try {
            scheduler.start();
            log.info("启动调度器 ");
        } catch (SchedulerException e) {
            log.error(e.getMessage(),e);
            log.error("启动调度器=> [失败]");
        }
    }


    /**
     * 新增定时任务
     * @param name 定时任务的名称
     * @param group 定时任务分组
     * @param clazz 需要执行的定时任务类
     * @param cronExpression cron 表达式
     */
    public void addJob(String name, String group, Class<? extends Job> clazz, String cronExpression) {
        try {

            //构造任务
            JobDetail jobDetail= JobBuilder.newJob(clazz)
                    .withIdentity(name,group)
                    .build();

            CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder
                    .cronSchedule(cronExpression);
            //构造任务触发器
            CronTrigger cronTrigger=TriggerBuilder
                    .newTrigger().withIdentity(name,group)
                    .withSchedule(cronScheduleBuilder).build();
            //将作业添加到调度器
            scheduler.scheduleJob(jobDetail,cronTrigger);

        } catch (SchedulerException e) {
            log.error(e.getMessage(),e);
            log.error("创建作业=> [作业名称:" + name + " 作业组:" + group + "]=> [失败]");
        }
    }

    /**
     * 获取Job信息
     * @param name
     * @param group
     */
    public String getjobInfo(String name,String group) throws SchedulerException {
        TriggerKey triggerKey=new TriggerKey(name,group);
        CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
        return String.format("time:%s,state:%s",cronTrigger.getCronExpression(),
                scheduler.getTriggerState(triggerKey).name());
    }

    /**
     * 修改任务的执行时间
     * @param name
     * @param group
     * @param cron cron表达式
     * @return
     * @throws SchedulerException
     */
    public boolean modifyJob(String name,String group,String cron) throws SchedulerException{
        Date date=null;
        TriggerKey triggerKey=new TriggerKey(name, group);
        CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
        String oldTime=cronTrigger.getCronExpression();
        if (!oldTime.equalsIgnoreCase(cron)){
            CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(cron);
            CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(name,group)
                    .withSchedule(cronScheduleBuilder).build();
            date=scheduler.rescheduleJob(triggerKey,trigger);
        }
        return date !=null;
    }

    /**
     * 暂停所有任务
     * @throws SchedulerException
     */
    public void pauseAllJob()throws SchedulerException{
        scheduler.pauseAll();
    }

    /**
     * 暂停某个任务
     * @param name
     * @param group
     * @throws SchedulerException
     */
    public void pauseJob(String name,String group)throws SchedulerException{
        JobKey jobKey=new JobKey(name,group);
        JobDetail jobDetail=scheduler.getJobDetail(jobKey);
        if (jobDetail==null)
            return;
        scheduler.pauseJob(jobKey);
    }

    /**
     * 恢复所有任务
     * @throws SchedulerException
     */
    public void resumeAllJob()throws SchedulerException{
        scheduler.resumeAll();
    }
    /**
     * 恢复某个任务
     */
    public void resumeJob(String name,String group)throws SchedulerException{
        JobKey jobKey=new JobKey(name,group);
        JobDetail jobDetail=scheduler.getJobDetail(jobKey);
        if (jobDetail==null)
            return;
        scheduler.resumeJob(jobKey);
    }

    /**
     * 删除某个任务
     * @param name
     * @param group
     * @throws SchedulerException
     */
    public void deleteJob(String name,String group)throws SchedulerException{
        JobKey jobKey=new JobKey(name, group);
        JobDetail jobDetail=scheduler.getJobDetail(jobKey);
        if (jobDetail==null)
            return;
        scheduler.deleteJob(jobKey);
    }
}

 2.和数据库进行交互

package com.qdwy.qudaowuyoutask.util.quartz;

import com.qdwy.qudaowuyou.common.constant.QdwyConstant;
import com.qdwy.qudaowuyoubusiness.business.system.QdwyQuartzService;
import com.qdwy.qudaowuyoubusiness.system.entity.SysQuartz;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.quartz.Job;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;

import java.util.List;

/**
 * @Author zbf
 * @DATA 2019/11/21 16:04
 * @ClassIntroduction
 */
@Slf4j
@Configuration
public class QuartzListener implements ApplicationListener<ContextRefreshedEvent> {

    @Autowired
    private QuartzConfig quartzConfig;
    @Autowired
    private QdwyQuartzService quartzService;


    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        try {
            //1.查询所有的定时任务信息
            List<SysQuartz> sysQuartz = quartzService.getSysQuartz(QdwyConstant.QDWY_QUARTZ_START);
            if (CollectionUtils.isNotEmpty(sysQuartz)){
                Job job = null;
                for (SysQuartz quartz : sysQuartz) {
                   //根据类路径创建工作对象
                    job = (Job) Class.forName(quartz.getQuartzClass()).newInstance();
                     //将工作任务放入工作空间                   quartzConfig.addJob(quartz.getQuartzClass(),quartz.getQuartzGroup(),job.getClass(),quartz.getQuartzCron());
                }
                //启动定时任务
                quartzConfig.start();
                log.info("[启动定时任务结束...]");
            }
            log.info("[没有可执行的定时任务]");
        } catch (Exception e) {
            log.info("启动定时任务异常"+e.getMessage(),e);
        }

    }
}

3.执行自己的job    

 

package com.qdwy.qudaowuyoutask.task;

import com.qdwy.qudaowuyoubusiness.business.system.QdwyQuartzService;
import com.qdwy.qudaowuyoubusiness.system.entity.SysQuartz;
import com.qdwy.qudaowuyoubusiness.system.entity.SysQuartzLog;
import com.qdwy.qudaowuyoutask.util.bean.QdwyBeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.time.LocalDateTime;

/**
 * @Author zbf
 * @DATA 2019/11/21 15:45
 * @ClassIntroduction
 */
@Slf4j
public class MyJob1 implements Job {


    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        test();
    }


    public void test(){
        QdwyQuartzService quartzService = QdwyBeanUtil.getBean(QdwyQuartzService.class);
         进行业务逻辑处理
        log.info("定时任务需要执行================......");   
    }

}

4.注意:

        spring boot 中不能直接在实现job的接口引用spring容器中的对象

 

解决方法:

       1.将spring 容器公有,可以拿到spring 容器

           spring boot 整合quartz

 

     2.建立自己可以获取spring容器中工具

package com.qdwy.qudaowuyoutask.util.bean;

import org.springframework.context.ConfigurableApplicationContext;

/**
 * @Author zbf
 * @DATA 2019/11/21 18:29
 * @ClassIntroduction
 */
public class QdwyBeanUtil {

    //将管理上下文的applicationContext设置成静态变量,供全局调用
    public static ConfigurableApplicationContext applicationContext;
    //定义一个获取已经实例化bean的方法
    public static <T> T getBean(Class<T> c){
        return applicationContext.getBean(c);
    }

}