springboot整合定时任务

pom.xml配置文件信息

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

创建数据库

CREATE TABLE `cc_task_info` (
  `TID` int(11) NOT NULL AUTO_INCREMENT,
  `TASK_ANME` varchar(50) NOT NULL,
  `TASK_CODE` varchar(50) NOT NULL,
  `JOB_CLASS` varchar(200) NOT NULL,
  `JOB_GROUP` varchar(50) NOT NULL,
  `CRON` varchar(50) NOT NULL,
  `DEL_STATUS` varchar(2) DEFAULT '1' NULL,
  `CRT_TIME` datetime DEFAULT NULL,
  PRIMARY KEY (`TID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='定时任务管理表';

对cc_task_info的增删改查

CcTaskInfo

package com.shengun.quartz.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 * 定时任务管理表
 * </p>
 *
 * @author shengun
 * @since 2022-06-08
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="CcTaskInfo对象", description="定时任务管理表")
public class CcTaskInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "TID", type = IdType.AUTO)
    private Integer tid;

    @TableField("TASK_ANME")
    private String taskAnme;

    @TableField("TASK_CODE")
    private String taskCode;

    @TableField("JOB_CLASS")
    private String jobClass;

    @TableField("JOB_GROUP")
    private String jobGroup;

    @TableField("CRON")
    private String cron;

    @TableField("DEL_STATUS")
    private String delStatus;

    @TableField("CRT_TIME")
    private Date crtTime;

}

CcTaskInfoService

package com.shengun.quartz.service;

import com.shengun.quartz.entity.CcTaskInfo;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * <p>
 * 定时任务管理表 服务类
 * </p>
 *
 * @author shengun
 * @since 2022-06-08
 */
public interface CcTaskInfoService extends IService<CcTaskInfo> {

    //增
    public void addTaskInfo(CcTaskInfo ccTaskInfo);

    //删除
    public void delTaskInfo(int id);

    //改
    public void updateTaskInfo(CcTaskInfo ccTaskInfo);

    //查
    public List<CcTaskInfo> getTaskInfo();

}

CcTaskInfoServiceImpl

package com.shengun.quartz.service.impl;

import com.shengun.quartz.entity.CcTaskInfo;
import com.shengun.quartz.mapper.CcTaskInfoMapper;
import com.shengun.quartz.service.CcTaskInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shengun.quartz.service.QuartzService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.List;

/**
 * <p>
 * 定时任务管理表 服务实现类
 * </p>
 *
 * @author shengun
 * @since 2022-06-08
 */
@Service
public class CcTaskInfoServiceImpl extends ServiceImpl<CcTaskInfoMapper, CcTaskInfo> implements CcTaskInfoService {

    @Autowired
    private QuartzService quartzService;

    @Transactional
    @Override
    public void addTaskInfo(CcTaskInfo ccTaskInfo) {
        //现在数据库中添加详细信息
        int insert = this.baseMapper.insert(ccTaskInfo);
        if(insert>0){
            //在启动定时任务
            try {
                quartzService.startJob(ccTaskInfo.getTaskCode(),
                        ccTaskInfo.getTaskAnme(),
                        ccTaskInfo.getCron(),
                        ccTaskInfo.getJobGroup(),
                        ccTaskInfo.getJobClass());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void delTaskInfo(int id) {
        this.baseMapper.deleteById(id);
    }

    @Override
    public void updateTaskInfo(CcTaskInfo ccTaskInfo) {
        this.baseMapper.updateById(ccTaskInfo);
    }

    @Override
    public List<CcTaskInfo> getTaskInfo() {
        return this.baseMapper.selectList(null);
    }

}

CcTaskInfoController

package com.shengun.quartz.controller;


import com.shengun.annotation.OperationAnnotation;
import com.shengun.quartz.entity.CcTaskInfo;
import com.shengun.quartz.service.CcTaskInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 定时任务管理表 前端控制器
 * </p>
 *
 * @author shengun
 * @since 2022-06-08
 */
@RestController
@RequestMapping("/quartz/cc-task-info")
public class CcTaskInfoController {

    @Autowired
    private CcTaskInfoService ccTaskInfoService;

    @GetMapping("/list")
    @OperationAnnotation
    public Map<String,Object> getTaskInfos(){
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "查询成功");
        List<CcTaskInfo> taskInfos = ccTaskInfoService.getTaskInfo();
        map.put("list",taskInfos);
        return map;
    }

    @PostMapping("/add")
    @OperationAnnotation
    public Map<String,Object> addTaskInfo(@RequestBody CcTaskInfo ccTaskInfo){
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "添加成功");
        if(ccTaskInfo.getCron() == null){
            return null;
        }
        ccTaskInfo.setCrtTime(new Date());
        ccTaskInfoService.addTaskInfo(ccTaskInfo);
        map.put("flag", true);
        return map;
    }
}


定时任务配置文件QuartzConfig

package com.shengun.quartz.config;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfig {
    @Bean
    public Scheduler scheduler(){
        Scheduler scheduler = null;
        SchedulerFactory factory = new StdSchedulerFactory();
        try {
            scheduler = factory.getScheduler();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        if(scheduler != null){
            try {
                //启动定时任务
                scheduler.start();
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
        return scheduler;
    }
}

QuartzService定时任务服务

package com.shengun.quartz.service;

import com.shengun.quartz.entity.CcTaskInfo;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.List;

/**
 * 定时任务管理服务
 */
@Service
public class QuartzService {

    public static String SCHEDULER_OPR_START = "start";
    public static String SCHEDULER_OPR_PAUSE = "pause";
    public static String SCHEDULER_OPR_RESUME = "resume";
    public static String SCHEDULER_OPR_REMOVE = "remove";

    @Autowired
    private CcTaskInfoService ccTaskInfoService;

    @Autowired
    private Scheduler scheduler;

    /**
     * 项目启动的时候初始化
     */
    @PostConstruct
    public void init(){
        List<CcTaskInfo> taskInfo = ccTaskInfoService.getTaskInfo();
        for (CcTaskInfo ccTaskInfo : taskInfo) {
            if(ccTaskInfo.getDelStatus().equals("1")){
                System.out.println("#######可以启动:" + ccTaskInfo.getTaskAnme());
                try {
                    startJob(ccTaskInfo.getTaskCode(),
                            ccTaskInfo.getTaskAnme(),
                            ccTaskInfo.getCron(),
                            ccTaskInfo.getJobGroup(),
                            ccTaskInfo.getJobClass());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 启动任务
     */
    public void startJob(String taskCode, String taskAnme, String cron, String jobGroup,
                         String className) throws Exception{
        Class<Job> jobClass = null;
        try {
            jobClass = (Class<Job>) Class.forName(className);//获取任务执行类
        } catch (ClassNotFoundException e) {
            throw new Exception("任务类不存在");
        }
        //创建job,指定job名称和分组
        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(taskCode, jobGroup).build();
        //创建表达式工作计划
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
        //创建触发器
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(taskCode, jobGroup)
                .withSchedule(cronScheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);
    }

    /**
     * 修改定时任务执行时间
     * @param taskCode
     * @param jobGroup
     * @param cron 新的时间
     * @throws Exception
     */
    public void modifyJob(String taskCode, String jobGroup, String cron) throws Exception{
        TriggerKey triggerKey = new TriggerKey(taskCode, jobGroup);
        CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        String oldCron = trigger.getCronExpression();
        if(!oldCron.equals(cron)){
            CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(taskCode, jobGroup)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
            Date date = scheduler.rescheduleJob(triggerKey, cronTrigger);
            if(date == null){
                throw new Exception("修改定时任务执行时间报错");
            }
        }
    }

    /**
     * 暂停某个定时任务(任务恢复后,暂停时间段内未执行的任务会继续执行,如暂停时间段内有2次,则会执行2次)
     * @param taskCode
     * @param jobGroup
     * @throws Exception
     */
    public void pauseJob(String taskCode, String jobGroup) throws Exception{
        JobKey jobKey = new JobKey(taskCode, jobGroup);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if(jobDetail == null){
            return;
        }
        scheduler.pauseJob(jobKey);
    }

    /**
     * 恢复某个定时任务
     * @param taskCode
     * @param jobGroup
     * @throws Exception
     */
    public void resumeJob(String taskCode, String jobGroup) throws Exception{
        JobKey jobKey = new JobKey(taskCode, jobGroup);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if(jobDetail == null){
            return;
        }
        scheduler.resumeJob(jobKey);
    }

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

创建几个定时任务

package com.shengun.quartz.task;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.util.Date;

public class DemoJob1 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String taskCode = jobExecutionContext.getJobDetail().getKey().getName();
        System.out.println("定时任务1"+taskCode + new Date());
    }
}

在这里插入图片描述

数据库中的数据

在这里插入图片描述

运行结果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值