springboot quartz动态定时任务

动态定时任务步骤如下:
1.添加相关依赖,当然其中mysql和jpa可以结合自己的

<!-- jpa依赖 start-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- jpa依赖 start-->
        <!-- mysql依赖 start-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- mysql依赖 end-->
        <!-- quartz -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

2.新建数据库实体

package com.wgu.entity;

import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

/**
 * @Author: w
 * @Date: 2019/9/19 8:55
 * @Version 1.0
 */
@Data
@Entity
@Table(name = "wgu_job") // 数据库名字
@NoArgsConstructor
public class Job {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY) //自增长
    @Column(columnDefinition="int(11) COMMENT '任务id'")
    private Long id;

    @Column(columnDefinition = "varchar(50) COMMENT '任务类名'")
    private String jobClassName;
    // 组名
    @Column(columnDefinition = "varchar(50) COMMENT '任务分组名'")
    private String jobGroupName;
    // cron表达式
    @Column(columnDefinition = "varchar(50) COMMENT 'cron时间表达式'")
    private String cronExpression;

    @Column(columnDefinition = "varchar(2) COMMENT '任务状态 0-暂停 1-启动'")
    private String status;//状态 0-暂停 1-启动
}

3.新建仓库层
略。
4.新建baseJob

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

public interface BaseJob extends Job {
	public void execute(JobExecutionContext context) throws JobExecutionException;
}

5.核心工具类

import com.wgu.job.BaseJob;
import org.quartz.*;

import javax.annotation.Resource;
import java.util.Iterator;
import java.util.Map;

/**
 * @Author: w
 * @Date: 2019/9/18 8:58
 * @Version 1.0
 */
public class MyScheduler {
    @Resource
    private Scheduler scheduler;

    /**
     * 添加定时任务并启动
     * @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
     * @param jobGroupName 任务分组名
     * @param cronExpression cron表达式 控制时间
     * @throws Exception
     */
    public void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception{
        // 启动调度器
        scheduler.start();

        // 构建job信息
        JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass())
                .withIdentity(jobClassName, jobGroupName).build();

        // 表达式调度构建器(即任务执行的时间)
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);

        // 按新的cronExpression表达式构建一个新的trigger
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName)
                .withSchedule(scheduleBuilder).build();

        scheduler.scheduleJob(jobDetail, trigger);
    }

    /**
     * 暂停定时任务
     * @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
     * @param jobGroupName 任务分组名
     * @throws Exception
     */
    public void pauseJob(String jobClassName, String jobGroupName) throws Exception{
        scheduler.pauseJob(JobKey.jobKey(jobClassName, jobGroupName));
    }

    /**
     *  恢复定时任务
     * @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
     * @param jobGroupName 任务分组名
     * @throws Exception
     */
    public void resumeJob(String jobClassName, String jobGroupName) throws Exception{
        scheduler.resumeJob(JobKey.jobKey(jobClassName, jobGroupName));
    }

    /**
     *  删除定时任务
     * @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
     * @param jobGroupName 任务分组名
     * @throws Exception
     */
    public void deleteJob(String jobClassName, String jobGroupName) throws Exception{
        scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName));
        scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName));
        scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName));
    }

    /**
     * 修改定时任务并立即启动
     * @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
     * @param jobGroupName 任务分组名
     * @param cronExpression cron表达式
     * @throws Exception
     */
    public void updateJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception{
        TriggerKey triggerKey = TriggerKey.triggerKey(jobClassName, jobGroupName);
        // 表达式调度构建器(动态修改后不立即执行)
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();

        CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);

        // 按新的cronExpression表达式重新构建trigger
        trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();

        // 按新的trigger重新设置job执行
        scheduler.rescheduleJob(triggerKey, trigger);
    }

    /**
     * 新增定时任务并启动
     * @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
     * @param jobGroupName 任务分组名
     * @param cronExpression cron表达式
     * @param jobDescription 任务描述
     * @param params 携带参数
     * @throws Exception
     */
    public void addJob(String jobClassName, String jobGroupName, String cronExpression,
                       String jobDescription, Map<String, Object> params) throws Exception{

        // 启动调度器
        scheduler.start();

        // 构建job信息
        JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass())
                .withIdentity(jobClassName, jobGroupName).withDescription(jobDescription).build();
        Iterator<Map.Entry<String, Object>> var7 = params.entrySet().iterator();
        var7.forEachRemaining(entry->
                jobDetail.getJobDataMap().put(entry.getKey(), entry.getValue())
        );
        System.out.println("jobDetail数据:--------"+jobDetail.toString());
        // 表达式调度构建器(即任务执行的时间)
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);

        // 按新的cronExpression表达式构建一个新的trigger
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName)
                .withSchedule(scheduleBuilder).build();

        scheduler.scheduleJob(jobDetail, trigger);
    }

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

6.新建两个测试的定时任务

import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.util.Date;

/**
 * @Author: w
 * @Date: 2019/9/17 16:07
 * @Version 1.0
 */
@Slf4j
@NoArgsConstructor
public class HelloJob implements BaseJob{
    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        log.error("Hello Job执行时间: " + new Date());
    }
}
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.util.Date;

/**
 * @Author: w
 * @Date: 2019/9/17 16:07
 * @Version 1.0
 */
@Slf4j
@NoArgsConstructor
public class NewJob implements BaseJob{
    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        log.error("New Job执行时间: " + new Date());
    }
}

附写死的定时任务:

@Slf4j
@Component
@EnableScheduling //开启定时任务注解
public class MyJob {
    @Scheduled(cron = "0 0 1-23 * * ?") //从1点开始每小时执行一次
    public void addNum(){
        log.info("从1点开始每小时执行一次");
    }

    @Scheduled(cron = "0 0 0 * * ? ") //每天0点执行更新
    public void reset(){
        log.info("每天0点执行更新");
    }

    @Scheduled(cron = "0 0/1 * * * ?") // 每分钟执行一次
    public void run(){
        log.info("每分钟执行一次");
    }
}

7.调用就完事了。
service

package com.wgu.service;

import java.util.Map;

/**
 * @Author: w
 * @Date: 2019/9/17 15:25
 * @Version 1.0
 */
public interface MyJobService {
    /**
     * 添加定时任务并启动
     * @param jobClassName 类名
     * @param jobGroupName 分组名
     * @param cronExpression cron表达式
     * @throws Exception
     */
    void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception;

    /**
     * 暂停定时任务
     * @param jobClassName 类名
     * @param jobGroupName 分组名
     * @throws Exception
     */
    void pauseJob(String jobClassName, String jobGroupName) throws Exception;

    /**
     * 恢复定时任务
     * @param jobClassName 类名
     * @param jobGroupName 分组名
     * @throws Exception
     */
    void resumeJob(String jobClassName, String jobGroupName) throws Exception;

    /**
     * 删除定时任务
     * @param jobClassName 类名
     * @param jobGroupName 分组名
     * @throws Exception
     */
    void deleteJob(String jobClassName, String jobGroupName) throws Exception;

    /**
     * 更新定时任务并启动
     * @param jobClassName 类名
     * @param jobGroupName 分组名
     * @param cronExpression cron表达式
     * @throws Exception
     */
    void updateJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception;

    /**
     * 新增定时任务并启动
     * @param jobClassName 类名
     * @param jobGroupName 分组名
     * @param cronExpression cron表达式
     * @param jobDescription 任务描述
     * @param params 携带参数
     * @throws Exception
     */
    void addJob(String jobClassName, String jobGroupName, String cronExpression, String jobDescription, Map<String, Object> params) throws Exception;
}

impl (注:加入数据库的步骤已略,请自行添加)

package com.wgu.service.impl;

import com.wgu.service.MyJobService;
import com.wgu.util.MyScheduler;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @Author: w
 * @Date: 2019/9/17 15:30
 * @Version 1.0
 */
@Service
public class MyJobServiceImpl implements MyJobService {
    private MyScheduler myScheduler = new MyScheduler();

    @Override
    public void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception {
        myScheduler.addJob(jobClassName, jobGroupName, cronExpression);
    }

    @Override
    public void pauseJob(String jobClassName, String jobGroupName) throws Exception {
        myScheduler.pauseJob(jobClassName, jobGroupName);
    }

    @Override
    public void resumeJob(String jobClassName, String jobGroupName) throws Exception {
        myScheduler.resumeJob(jobClassName, jobGroupName);
    }

    @Override
    public void deleteJob(String jobClassName, String jobGroupName) throws Exception {
        myScheduler.deleteJob(jobClassName, jobGroupName);
    }

    @Override
    public void updateJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception {
        myScheduler.updateJob(jobClassName, jobGroupName, cronExpression);
    }

    @Override
    public void addJob(String jobClassName, String jobGroupName, String cronExpression, String jobDescription, Map<String, Object> params) throws Exception {
        myScheduler.addJob(jobClassName, jobGroupName, cronExpression, jobDescription, params);
    }
}

OK,完事了,去调用,去实现吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值