Springboot集成Quartz

之前学习过spring的定时任务 :https://www.cnblogs.com/slimshady/p/10112515.html

 

本文主要学习记录下springboot使用quartz

1.  pom.xml   

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.quartz-scheduler</groupId>       <!-- Quartz -->
            <artifactId>quartz</artifactId>
            <version>2.2.3</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>               <!-- lombok @Slf4j注解用于日志输出--> 
<version>1.16.22</version>
<scope>provided</scope>
</dependency>

 

2.   代码结构

     

3.  SimpleTriggerJob.java

package com.example.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 任务一 使用simpleTrigger
 * Created by Administrator on 2018/12/20.
 */
@Component
@Slf4j
public class SimpleTriggerJob {
    public void printMessage() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss ");
        log.info("SimpleTriggerFactoryBean任务在"+sdf.format(new Date())+"执行......");
    }
}

 

4.CronTriggerJob.java

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/** 
* 任务二 使用cronTrigger

* Created by Administrator on 2018/12/20.
*/
@Component("jobCornBean")
@Slf4j
public class CronTriggerJob {
    public void printAnotherMessage(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss ");
        log.info("CronTriggerFactoryBean任务在"+sdf.format(new Date())+"执行.....");
    }
}

5. JobConfig.java

import com.example.bean.JobConfigBean;
import com.example.service.CronTriggerJob;
import com.example.service.ScheduledJob;
import com.example.service.SimpleTriggerJob;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import org.springframework.scheduling.quartz.*;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/12/20.
 */
@Configuration
public class JobConfig {

    @Autowired
    private SimpleTriggerJob jobBean;

    @Autowired
    private ScheduledJob scheduledJob;


    @Autowired
    private CronTriggerJob jobCornBean;


    /**
     * 配置调度器第一种方式
     * @return
     */
    @Bean("methodInvokingJobDetailFactoryBean")
    public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){
        MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
        bean.setTargetObject(jobBean);
        bean.setTargetMethod("printMessage");
        bean.setConcurrent(false);
        return bean;
    }

    /**
     * 配置调度器第二种方式 可以传递额外的参数给定时job
     * @return
     */
    @Bean("jobDetailFactoryBean")
    public JobDetailFactoryBean jobDetailFactoryBean(){
        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        jobDetailFactoryBean.setJobClass(scheduledJob.getClass());
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("jobCornBean",jobCornBean);
        jobDetailFactoryBean.setJobDataMap(jobDataMap);
        jobDetailFactoryBean.setDurability(true);
        return jobDetailFactoryBean;
    }


    /**
     * 触发器 simpleTriggerFactoryBean
     * @param methodInvokingJobDetailFactoryBean
     * @return
     */
    @Bean("simpleTriggerFactoryBean")
    public SimpleTriggerFactoryBean simpleTriggerFactoryBean(MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean){
        SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean();
        simpleTriggerFactoryBean.setJobDetail(methodInvokingJobDetailFactoryBean.getObject());
        simpleTriggerFactoryBean.setStartDelay(1000);
        simpleTriggerFactoryBean.setRepeatInterval(1000);//每秒执行一次

        return simpleTriggerFactoryBean;
    }


    /**
     * 触发器  cronTriggerFactoryBean
     * @param jobDetailFactoryBean
     * @return
     */
    @Bean("cronTriggerFactoryBean")
    public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
        CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
        cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
        cronTriggerFactoryBean.setCronExpression("0/5 * * ? * *");//每5秒执行一次
        return cronTriggerFactoryBean;
    }

    /**
     * 将上面的jobDetails和triggers都配置到一个类中,这样便于后续定时任务的添加
     * @return
     */
    @Bean("jobConfigBean")
    public JobConfigBean jobConfigBean(){
        JobConfigBean jobConfigBean = new JobConfigBean();
        List<JobDetail> jobDetails = new ArrayList<>();
        jobDetails.add(methodInvokingJobDetailFactoryBean().getObject());
        jobDetails.add(jobDetailFactoryBean().getObject());

        JobDetail[] jobDetailarr = createJobDetail(jobDetails);

        List<Trigger> triggers = new ArrayList<>();
        triggers.add(simpleTriggerFactoryBean(methodInvokingJobDetailFactoryBean()).getObject());
        triggers.add(cronTriggerFactoryBean(jobDetailFactoryBean()).getObject());


        Trigger[] triggerarr = createTriggers(triggers);

        jobConfigBean.setJobDetails(jobDetailarr);
        jobConfigBean.setTriggers(triggerarr);

        return jobConfigBean;
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(JobConfigBean jobConfigBean){

        //一个定时任务
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setJobDetails(jobConfigBean.getJobDetails());
        schedulerFactoryBean.setTriggers(jobConfigBean.getTriggers());

        return schedulerFactoryBean;
    }

    public static JobDetail[] createJobDetail(List<JobDetail> jobDetails){
        JobDetail[] jobDetailArr = new JobDetail[jobDetails.size()];
        for (int i = 0; i < jobDetails.size(); i++) {
            jobDetailArr[i] = jobDetails.get(i);
        }

        return jobDetailArr;

    }


    public static Trigger[] createTriggers(List<Trigger> triggers){
        Trigger[] triggerarr = new Trigger[triggers.size()];

        for (int i = 0; i <triggers.size() ; i++) {
            triggerarr[i] = triggers.get(i);
        }

        return triggerarr;
    }
}

6. JobConfigBean.java

import org.quartz.JobDetail;
import org.quartz.Trigger;


public class JobConfigBean {

    private JobDetail[] jobDetails;

    private Trigger[] triggers;

    public JobDetail[] getJobDetails() {
        return jobDetails;
    }

    public void setJobDetails(JobDetail[] jobDetails) {
        this.jobDetails = jobDetails;
    }

    public Trigger[] getTriggers() {
        return triggers;
    }

    public void setTriggers(Trigger[] triggers) {
        this.triggers = triggers;
    }
}

7.  ScheduledJob.java

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;


@Component
public class ScheduledJob extends QuartzJobBean {

    private CronTriggerJob jobCornBean;


    @Override
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {
           jobCornBean.printAnotherMessage();
    }

    public void setJobCornBean(CronTriggerJob jobCornBean) {
        this.jobCornBean = jobCornBean;
    }
}

8.启动springboot 执行结果如下:

 

9. 代码下载地址:https://github.com/liuchunbo24/springboot-quartz

posted @ 2018-12-21 11:04  乐癌晚期患者  阅读(687)  评论(0编辑  收藏  举报