Springboot 实现基于Quartz的定时任务(源码)

一、quartz的基本概念

1、Job

表示一个工作,要执行的具体内容。此接口中只有一个方法

void execute(JobExecutionContext context) 

2、JobDetail

JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。 

3、Trigger代表一个调度参数的配置,什么时候去调。 

4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。

Springboot 实现基于Quartz的定时任务(源码)_第1张图片

二、源码 

1、pom:

        
        
            org.quartz-scheduler
            quartz
            2.2.1
        
        
        
            org.springframework
            spring-context-support
        

 2、配置类:job+trigger+scheduler

/**  job指定处理什么操作、trigger指定什么时候执行、scheduler用于注册触发器trigger */

package com.insight.hr.timer.test;

import com.insight.hr.timer.test.QuartzTask;
import org.quartz.JobDetail;
import org.quartz.Trigger;
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;

/**
 * 配置任务
 * author  zhihf
 * deprecated
 */
@Configuration
public class QuartzConfiguration {

    /**
     *  配置任务
     * @param quartzTask QuartzTask为需要执行的任务
     * @return
     */
    @Bean(name = "reptilianJob")
    public MethodInvokingJobDetailFactoryBean detailFactoryBean(QuartzTask quartzTask) {

        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();

        // 是否并发执行
        jobDetail.setConcurrent(true);

        // 设置任务的名字
        jobDetail.setName("reptilianJob");

        // 设置任务的分组,在多任务的时候使用
        jobDetail.setGroup("reptilianJobGroup");

        // 需要执行的对象
        jobDetail.setTargetObject(quartzTask);

        /*
         * TODO  非常重要
         * 执行QuartzTask类中的需要执行方法
         */
        jobDetail.setTargetMethod("reptilian");
        return jobDetail;
    }

    /**
     * 定时触发器
     * @param reptilianJob 任务
     * @return
     */
    @Bean(name = "jobTrigger")
    public CronTriggerFactoryBean cronJobTrigger(JobDetail reptilianJob){

        CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();

        tigger.setJobDetail(reptilianJob);

        //cron表达式,每天10、15、20发送
        tigger.setCronExpression("0 0 10,15,20 * * ?");
        tigger.setName("reptilianTrigger");
        return tigger;
    }

    /**
     * 调度工厂
     * @param jobTrigger 触发器
     * @return
     */
    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactory(Trigger jobTrigger) {

        SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();

        // 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
        factoryBean.setOverwriteExistingJobs(true);

        // 延时启动,应用启动1秒后
        factoryBean.setStartupDelay(1);

        // 注册触发器
        factoryBean.setTriggers(jobTrigger);
        return factoryBean;
    }

}

3、job逻辑处理类

package com.insight.hr.timer.test;

import com.insight.hr.email.web.MailController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * 使用quartz框架
 */
@Service
public class QuartzTask {
    @Autowired
    MailController mailController;
    /**
     * 业务逻辑
     */
    public void reptilian(){
        System.out.println("执行定时任务:发送邮件"+new Date());
//        定时发送邮件
        mailController.sendInlineResourceMail();
    }

}

你可能感兴趣的:(Spring)