Spring Boot集成Quartz,管理动态定时任务

1、添加maven依赖

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

2、创建数据库SQL,可以到quartz官网下载的quartz包中查找

#
# Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar
#
# PLEASE consider using mysql with innodb tables to avoid locking issues
#
# In your Quartz properties file, you'll need to set
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#

DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;


CREATE TABLE QRTZ_JOB_DETAILS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    JOB_NAME  VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    JOB_CLASS_NAME   VARCHAR(250) NOT NULL,
    IS_DURABLE VARCHAR(1) NOT NULL,
    IS_NONCONCURRENT VARCHAR(1) NOT NULL,
    IS_UPDATE_DATA VARCHAR(1) NOT NULL,
    REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
);

CREATE TABLE QRTZ_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    JOB_NAME  VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    NEXT_FIRE_TIME BIGINT(13) NULL,
    PREV_FIRE_TIME BIGINT(13) NULL,
    PRIORITY INTEGER NULL,
    TRIGGER_STATE VARCHAR(16) NOT NULL,
    TRIGGER_TYPE VARCHAR(8) NOT NULL,
    START_TIME BIGINT(13) NOT NULL,
    END_TIME BIGINT(13) NULL,
    CALENDAR_NAME VARCHAR(200) NULL,
    MISFIRE_INSTR SMALLINT(2) NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
        REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
);

CREATE TABLE QRTZ_SIMPLE_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    REPEAT_COUNT BIGINT(7) NOT NULL,
    REPEAT_INTERVAL BIGINT(12) NOT NULL,
    TIMES_TRIGGERED BIGINT(10) NOT NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_CRON_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    CRON_EXPRESSION VARCHAR(200) NOT NULL,
    TIME_ZONE_ID VARCHAR(80),
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    STR_PROP_1 VARCHAR(512) NULL,
    STR_PROP_2 VARCHAR(512) NULL,
    STR_PROP_3 VARCHAR(512) NULL,
    INT_PROP_1 INT NULL,
    INT_PROP_2 INT NULL,
    LONG_PROP_1 BIGINT NULL,
    LONG_PROP_2 BIGINT NULL,
    DEC_PROP_1 NUMERIC(13,4) NULL,
    DEC_PROP_2 NUMERIC(13,4) NULL,
    BOOL_PROP_1 VARCHAR(1) NULL,
    BOOL_PROP_2 VARCHAR(1) NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_BLOB_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    BLOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_CALENDARS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    CALENDAR_NAME  VARCHAR(200) NOT NULL,
    CALENDAR BLOB NOT NULL,
    PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
);

CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_GROUP  VARCHAR(200) NOT NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_FIRED_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    ENTRY_ID VARCHAR(95) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    INSTANCE_NAME VARCHAR(200) NOT NULL,
    FIRED_TIME BIGINT(13) NOT NULL,
    SCHED_TIME BIGINT(13) NOT NULL,
    PRIORITY INTEGER NOT NULL,
    STATE VARCHAR(16) NOT NULL,
    JOB_NAME VARCHAR(200) NULL,
    JOB_GROUP VARCHAR(200) NULL,
    IS_NONCONCURRENT VARCHAR(1) NULL,
    REQUESTS_RECOVERY VARCHAR(1) NULL,
    PRIMARY KEY (SCHED_NAME,ENTRY_ID)
);

CREATE TABLE QRTZ_SCHEDULER_STATE
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    INSTANCE_NAME VARCHAR(200) NOT NULL,
    LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
    CHECKIN_INTERVAL BIGINT(13) NOT NULL,
    PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
);

CREATE TABLE QRTZ_LOCKS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    LOCK_NAME  VARCHAR(40) NOT NULL,
    PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);


commit;

3、在resource下添加quartz的属性配置文件quartz.properties

# 固定前缀org.quartz
# 主要分为scheduler、threadPool、jobStore、plugin等部分
#
#
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false

# 实例化ThreadPool时,使用的线程类为SimpleThreadPool
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

# threadCount和threadPriority将以setter的形式注入ThreadPool实例
# 并发个数
org.quartz.threadPool.threadCount = 10
# 优先级
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

org.quartz.jobStore.misfireThreshold = 6000

# 默认存储在内存中
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

#持久化
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.clusterCheckinInterval = 15000  
org.quartz.jobStore.isClustered = true

4、创建job的实例工厂,把quartz相关的bean交给spring管理,解决@Autowire无法注入的问题

package com.**.dv.modules.quartz;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;

/**
 * @ClassName JobFactory
 * @Description TODO
 * @Date 2019/7/1
 * @Version 1.0
 **/
@Component
public class JobFactory extends AdaptableJobFactory {

    @Autowired
    private AutowireCapableBeanFactory factory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入
        factory.autowireBean(jobInstance);
        return jobInstance;
    }

}

5、创建quartz的配置文件QuartzConfig

package com.**.dv.conf;

import com.**.dv.modules.quartz.JobFactory;
import org.quartz.Scheduler;
import org.quartz.ee.servlet.QuartzInitializerListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import javax.sql.DataSource;
import java.io.IOException;
import java.util.Properties;

@Configuration
public class QuartzConfig {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private JobFactory jobFactory;

    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        //在quartz.properties中的属性被读取并注入后再初始化对象
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }
    @Bean(name = "SchedulerFactory")
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setQuartzProperties(quartzProperties());
        factory.setDataSource(dataSource);
        factory.setJobFactory(jobFactory);
        return factory;
    }

    @Bean
    public QuartzInitializerListener executorListener(){
        return new QuartzInitializerListener();
    }

    @Bean(name="Scheduler")
    public Scheduler scheduler() throws IOException {
        Scheduler scheduler = schedulerFactoryBean().getScheduler();
        return scheduler;
    }
}

6、创建基础任务接口,新建任务实现该接口

package com.**.dv.quartz.job.base;

import org.quartz.Job;

/**
 * @ClassName BaseJob
 * @Description TODO
 * @Date 2019/7/2
 * @Version 1.0
 **/
public interface BaseJob extends Job {
}

7、创建测试任务,并用@Component注释,把任务交给spring管理

package com.**.dv.job.task.base;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @ClassName HelloJob
 * @Description TODO
 * @Date 2019/7/2
 * @Version 1.0
 **/
@Component
public class HelloJob implements BaseJob {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        Long stime = System.currentTimeMillis();
        logger.info("开始时间:"+stime);
        System.out.println("HelleJob......");
        logger.info("结束时间:{}",System.currentTimeMillis());
    }
}

8、创建bean工具类,通过beanid获取bean实例

package com.**.dv.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @ClassName BeanUtil
 * @Description 通过容器中的beanId获取bean
 * @Date 2019/6/10
 * @Version 1.0
 **/
@Component
public class BeanUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    
    public static <T> T getBean(String name) throws BeansException {
        return (T) applicationContext.getBean(name);
    }
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }

    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name,clazz);
    }

}

9、创建自定义表qrtz_job_info的实体类,用于存放job基本信息

package com.**.dv.modules.quartz.entity;

import javax.persistence.*;

/**
 * @ClassName QrtzJobInfoEntity
 * @Description TODO
 * @Date 2019/7/3
 * @Version 1.0
 **/
@Entity
@Table(name = "qrtz_job_info")
public class QrtzJobInfoEntity {

    @Id
    @GeneratedValue
    private Integer id;

    @Column
    private String jobName;
    @Column
    private String jobGroup;
    @Column
    private String jobCron;
    @Column
    private String jobStatus;
    @Column
    private String jobTitle;
    @Column
    private Long jobDate = System.currentTimeMillis();

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public String getJobGroup() {
        return jobGroup;
    }

    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }

    public String getJobCron() {
        return jobCron;
    }

    public void setJobCron(String jobCron) {
        this.jobCron = jobCron;
    }

    public String getJobStatus() {
        return jobStatus;
    }

    public void setJobStatus(String jobStatus) {
        this.jobStatus = jobStatus;
    }

    public String getJobTitle() {
        return jobTitle;
    }

    public void setJobTitle(String jobTitle) {
        this.jobTitle = jobTitle;
    }

    public Long getJobDate() {
        return jobDate;
    }

    public void setJobDate(Long jobDate) {
        this.jobDate = jobDate;
    }
}

10、创建controller和service,对外提供接口

package com.**.dv.modules.quartz.controller;

import com.**.dv.common.vo.PageableVO;
import com.**.dv.modules.quartz.bean.JobBean;
import com.**.dv.modules.quartz.condition.QuartzCondition;
import com.**.dv.modules.quartz.entity.QrtzJobInfoEntity;
import com.**.dv.modules.quartz.service.QuartzService;
import com.**.dv.job.task.base.BaseJob;
import com.**.dv.utils.Response;
import com.**.dv.utils.ResponseUtil;
import io.swagger.annotations.ApiOperation;
import org.quartz.*;
import org.quartz.impl.matchers.GroupMatcher;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

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

/**
 * @ClassName QuartzController
 * @Description TODO
 * @Date 2019/7/2
 * @Version 1.0
 **/
@RestController
@RequestMapping("/quartz")
public class QuartzController {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    @Qualifier("Scheduler")
    private Scheduler scheduler;

    @Autowired
    private QuartzService quartzService;

    @ApiOperation("查询全部任务列表(包括正在执行和暂定的)")
    @GetMapping("/list")
    public Response getJobList(QuartzCondition condition){
        PageableVO list = quartzService.getJobList(condition);
        return ResponseUtil.success(list);
    }

    @ApiOperation("查询全部任务(包括正在执行和暂定的)")
    @GetMapping("/job")
    public Response queryJob(){
        List<JobBean> list = new ArrayList<>();
        try {
            for(String groupName:scheduler.getJobGroupNames()){
                for(JobKey jobKey:scheduler.getJobKeys(GroupMatcher.groupEquals(groupName))){
                    JobBean jobBean = new JobBean();
                    jobBean.setJobName(jobKey.getName());
                    jobBean.setGroupName(jobKey.getGroup());
                    TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), jobKey.getGroup());
                    CronTriggerImpl cronTriggerImpl = (CronTriggerImpl) scheduler.getTrigger(triggerKey);
                    jobBean.setStatus(scheduler.getTriggerState(triggerKey).name());
                    jobBean.setCron(cronTriggerImpl.getCronExpression());
                    list.add(jobBean);
                    logger.info("Current JOB : {}",jobKey);
                }
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return ResponseUtil.success(list);
    }

    @ApiOperation("新增定时任务")
    @PostMapping("/job")
    public Response addJob(@RequestBody QrtzJobInfoEntity entity){
        quartzService.addJob(entity);
        return ResponseUtil.success();
    }
    @ApiOperation("新增定时任务")
    @PostMapping("/modify")
    public Response modifyJob(@RequestBody QrtzJobInfoEntity entity){
        quartzService.modifyJob(entity);
        return ResponseUtil.success();
    }

    @ApiOperation("删除指定任务")
    @DeleteMapping("/job/{ids}")
    public Response deleteJob(@PathVariable("ids") Integer[] ids){
        quartzService.deleteJob(ids);
        return ResponseUtil.success();
    }

    @ApiOperation("恢复任务")
    @PostMapping("/resume/{id}")
    public Response resumeJob(@PathVariable("id") Integer id){
        quartzService.resumeJob(id);
        return ResponseUtil.success();
    }
    @ApiOperation("暂停任务")
    @PostMapping("/pause/{id}")
    public Response pauseJob(@PathVariable("id") Integer id){
        quartzService.pauseJob(id);
        return ResponseUtil.success();
    }
    @ApiOperation("立即执行任务")
    @PostMapping("/start/{id}")
    public Response startJob(@PathVariable("id") Integer id){
        quartzService.startJob(id);
        return ResponseUtil.success();
    }

    public static BaseJob getClass(String classname) throws Exception{
        Class<?> class1 = Class.forName(classname);
        return (BaseJob)class1.newInstance();
    }

    @ApiOperation("删除全部定时任务")
    @DeleteMapping("/deleteAll")
    public ResponseEntity deleteJob(){
        try {
            scheduler.clear();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return ResponseEntity.ok("");
    }
}

package com.**.dv.modules.quartz.service.impl;

import com.**.dv.common.vo.PageableVO;
import com.**.dv.job.task.base.BaseJob;
import com.**.dv.modules.page.entity.PageInfoEntity;
import com.**.dv.modules.quartz.condition.QuartzCondition;
import com.**.dv.modules.quartz.entity.QrtzJobInfoEntity;
import com.**.dv.modules.quartz.repository.QrtzJobInfoRepository;
import com.**.dv.modules.quartz.service.QuartzService;
import com.**.dv.utils.BeanUtil;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName QuartzServiceImpl
 * @Description TODO
 * @Date 2019/7/3
 * @Version 1.0
 **/
@Service
public class QuartzServiceImpl implements QuartzService {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    @Qualifier("Scheduler")
    private Scheduler scheduler;

    @Autowired
    private QrtzJobInfoRepository qrtzJobInfoRepository;

    @Override
    public PageableVO getJobList(QuartzCondition condition) {
        Sort sort = new Sort(Sort.Direction.DESC, "jobDate");
        Pageable pageable = PageRequest.of(condition.getPage(), condition.getSize(), sort);
        Specification<QrtzJobInfoEntity> specification = (root, query, criteriaBuilder) -> {
            List<Predicate> list = new ArrayList<>();
            return criteriaBuilder.and(list.toArray(new Predicate[0]));
        };
        Page<QrtzJobInfoEntity> page = qrtzJobInfoRepository.findAll(specification, pageable);
        return new PageableVO(page);
    }

    @Transactional
    @Override
    public void addJob(QrtzJobInfoEntity entity) {
        String jobClassName = entity.getJobName();
        String jobCron = entity.getJobCron();
        try {
            scheduler.start();
            BaseJob jobBean = BeanUtil.getBean(jobClassName);
            //构建job信息
            JobDetail jobDetail = JobBuilder.newJob(jobBean.getClass()).withIdentity(jobClassName, jobClassName).build();
            //表达式调度构建器(即任务执行的时间)
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(jobCron);
            //按新的cronExpression表达式构建一个新的trigger
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobClassName).withSchedule(scheduleBuilder).build();
            scheduler.scheduleJob(jobDetail,trigger);
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClassName, jobClassName);
            entity.setJobStatus(scheduler.getTriggerState(triggerKey).name());
            entity.setJobGroup(jobClassName);
            qrtzJobInfoRepository.saveAndFlush(entity);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    @Transactional
    @Override
    public void deleteJob(Integer[] ids) {
        for(Integer id:ids){
            QrtzJobInfoEntity jobInfoEntity = qrtzJobInfoRepository.findById(id).get();
            String jobName = jobInfoEntity.getJobName();
            String groupName = jobInfoEntity.getJobGroup();
            try {
                TriggerKey key = TriggerKey.triggerKey(jobName,groupName);
                //停止触发器
                scheduler.pauseTrigger(key);
                //移除触发器
                scheduler.unscheduleJob(key);
                //删除任务
                boolean flag = scheduler.deleteJob(JobKey.jobKey(jobName,groupName));
                logger.info("定时任务:【{}】删除:{}",jobInfoEntity.getJobTitle(),flag);
                qrtzJobInfoRepository.deleteById(id);
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }

    }

    @Override
    public void resumeJob(Integer id) {
        QrtzJobInfoEntity jobInfoEntity = qrtzJobInfoRepository.findById(id).get();
        try {
            JobKey jobKey = JobKey.jobKey(jobInfoEntity.getJobName(), jobInfoEntity.getJobGroup());
            scheduler.resumeJob(jobKey);
            jobInfoEntity.setJobStatus("NORMAL");
            qrtzJobInfoRepository.saveAndFlush(jobInfoEntity);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void pauseJob(Integer id) {
        QrtzJobInfoEntity jobInfoEntity = qrtzJobInfoRepository.findById(id).get();
        try {
            JobKey jobKey = JobKey.jobKey(jobInfoEntity.getJobName(), jobInfoEntity.getJobGroup());
            scheduler.pauseJob(jobKey);
            jobInfoEntity.setJobStatus("PAUSED");
            qrtzJobInfoRepository.saveAndFlush(jobInfoEntity);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void startJob(Integer id) {
        QrtzJobInfoEntity jobInfoEntity = qrtzJobInfoRepository.findById(id).get();
        try {
            JobKey jobKey = JobKey.jobKey(jobInfoEntity.getJobName(),jobInfoEntity.getJobGroup());
            scheduler.triggerJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void modifyJob(QrtzJobInfoEntity entity) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(entity.getJobName(),entity.getJobGroup());
            //表达式调度构建器(即任务执行的时间)
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(entity.getJobCron());
            //按新的cronExpression表达式构建一个新的trigger
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(entity.getJobName(),entity.getJobGroup()).withSchedule(scheduleBuilder).build();
            scheduler.rescheduleJob(triggerKey,trigger);
            entity.setJobStatus("NORMAL");
            qrtzJobInfoRepository.saveAndFlush(entity);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

    }
}

前端使用vue写的,就暂时不放代码了,最终结果如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗夜91

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值