Spring系列——springboot整合quarter定時任務

簡介

本文主要介紹Spring系列Springboot整合quarter定時任務,大體分爲三個部分:添加jar包、建立一個定時任務的配置類、建立具體執行的任務,但願看完本文後對你們有所幫助。java

1、添加jar包

<!--quartz定時任務-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

2、建立一個定時任務的配置類

能夠理解爲 這個類要去執行什麼任務,何時去執行spring

package com.vale.info.server.quartz;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.vale.info.server.dao.CronDao;
import com.vale.info.server.entity.Cron;
import com.vale.info.server.global.RedisConstants;
import com.vale.info.server.util.InfoException;
import com.vale.info.server.util.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * TODO
 *
 * @author wasin
 * @version 1.0
 * @date 2020/9/7 19:33
 */
@Component
@Slf4j
public class TaskFileScheduler {

    @Resource
    private SchedulerFactoryBean schedulerFactoryBean;

    private Integer taskId;

    public void setTaskId(Integer taskId){
        this.taskId=taskId;
    }

    @Resource
    private Scheduler scheduler;

    /**
     * 設置任務的執行時間
     * @param scheduler
     * RedisConstants. 相關的是我本身定義的靜態變量 爲這個定時任務添加任務的名稱 和分組
     * 後期若是須要刪除時則找到相關的名稱去刪除便可
     * @throws SchedulerException
     */
    private void setTaskExecuteDate(Scheduler scheduler) throws SchedulerException {
        log.info("設置任務的執行時間 taskId={},任務名稱={},分組名稱={}",taskId,String.format(RedisConstants.QUARTER_JOB_NAME,taskId),String.format(RedisConstants.QUARTER_JOB_GROUP,taskId));
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class).withIdentity(String.format(RedisConstants.QUARTER_JOB_NAME,taskId), String.format(RedisConstants.QUARTER_JOB_GROUP,taskId)).build();
         //2020-9-18 18:18:18秒執行這個任務
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("18 18 18 18 9 ? 2020");
        JobDataMap jobDataMap=new JobDataMap();

        jobDataMap.put("taskId",this.taskId);
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(String.format(RedisConstants.QUARTER_TRIGGER_NAME,taskId), String.format(RedisConstants.QUARTER_TRIGGER_GROUP,taskId))
                .usingJobData(jobDataMap).withSchedule(scheduleBuilder).build();
        scheduler.scheduleJob(jobDetail,cronTrigger);
    }

    //業務代碼中掉用這個方法就能夠添加這個定時任務
    public void scheduleJobs(Integer taskId) throws SchedulerException {
        if(taskId==null){
            throw new InfoException("定時任務id不可爲空");
        }
        this.taskId=taskId;
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        setTaskExecuteDate(scheduler);
    }

    /**
     * 刪除定時任務
     * @param croId  定時任務id
     * @param jobName 任務名稱  就是任務id
     * @param jobGroup 任務分組 就是任務id
     */
    public void delJob(Integer croId,String jobName, String jobGroup) {
        try {
          log.info("刪除定時任務 jobName={},jobGroup={}",jobName,jobGroup);
            this.taskId=Integer.valueOf(jobName);
            jobName=String.format(RedisConstants.QUARTER_TRIGGER_NAME,jobName);
            jobGroup=String.format(RedisConstants.QUARTER_TRIGGER_GROUP,jobGroup);
            // TriggerKey 定義了trigger的名稱和組別 ,經過任務名和任務組名獲取TriggerKey
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName,jobGroup);
            if(triggerKey!=null){
                // 中止觸發器
                scheduler.resumeTrigger(triggerKey);
                // 移除觸發器
                scheduler.unscheduleJob(triggerKey);
                // 移除任務
                scheduler.deleteJob(JobKey.jobKey(jobName,jobGroup));
                log.info("定時任務刪除成功");
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

    }

}

3、建立具體執行的任務

能夠理解爲 這個任務要去作什麼 上面定義的是何時去作,誰去作mybatis

package com.vale.info.server.quartz;

import com.vale.info.server.dao.CronDao;
import com.vale.info.server.entity.Cron;
import com.vale.info.server.entity.Task;
import com.vale.info.server.global.UdpConstans;
import com.vale.info.server.util.ReadFile;
import com.vale.info.server.util.RedisUtils;
import com.vale.info.server.util.UdpFileClient;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;

/**
 * TODO
 * 定義一個須要去執行的任務
 * @author wasin
 * @version 1.0
 * @date 2020/9/7 19:25
 */
@Component
@Slf4j
public class TaskJob implements Job {

    //這些參數均可以在上面定義的類中傳過來

    private Integer taskId;

    public void setTaskId(Integer taskId) {
        this.taskId = taskId;
    }
    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        log.info("定時任務執行 taskId={}",taskId);
        //執行具體的業務邏輯 

    }
}

結尾

感謝你們看到最後,都看到最後了,點個贊再走吧,有不對的地方還請多多指正。app

相關文章
相關標籤/搜索