Quartz 调度器动态添加删除任务 动态任务调度 增删改查 API任务池 API接口开发

介绍

在实际项目开发中,任务调度通常是通过用户的操作来创建任务,而不是硬编码在程序中。这样可以根据用户需求动态地管理任务。Quartz 提供了丰富的增删改查(CRUD)API,允许开发者动态地管理调度任务。

封装工具类JobUtils

实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class JobTask {
    //任务名称
    String jobName;
    //时间表达式
    String cron;
    //任务组
    String group;

    //....业务其他信息
}

封装工具类

public class JobUtils {

    /**
     * 创建定时任务
     * @param scheduler 调度器
     * @param job 任务实体
     */
    public static void createJob(Scheduler scheduler, JobTask job, Class<? extends Job> jobClass) throws SchedulerException {

        JobDetail jobDetail = JobBuilder.newJob(jobClass)
                .storeDurably() //持久化
                .withIdentity(job.getJobName(), job.getGroup())
                .build();

       Trigger trigger= TriggerBuilder.newTrigger()
                .withIdentity(job.getJobName()+"_trigger") //触发器的 任务名 和 任务组 (起到标识作用)
                .forJob(jobDetail) //触发(到时间)执行哪个任务
                .withSchedule(CronScheduleBuilder.cronSchedule(job.getCron())) //具体执行的时间 cro表达式
                .build();

        scheduler.scheduleJob(jobDetail,trigger);
    }


    /**
     * 暂停任务
     * @param scheduler
     * @param job
     * @throws SchedulerException
     */
    public static void stopJob(Scheduler scheduler, JobTask job) throws SchedulerException {
        JobKey jobKey=JobKey.jobKey(job.getJobName());
        scheduler.pauseJob(jobKey);

    }

    /**
     * 恢复任务
     * @param scheduler
     * @param job
     * @throws SchedulerException
     */

    public static void resumeJob(Scheduler scheduler, JobTask job) throws SchedulerException {
        JobKey jobKey=JobKey.jobKey(job.getJobName());
        scheduler.resumeJob(jobKey);

    }

    /**
     * 删除任务
     * @param scheduler
     * @param job
     * @throws SchedulerException
     */
    public static void deleteJob(Scheduler scheduler, JobTask job) throws SchedulerException {
        JobKey jobKey=JobKey.jobKey(job.getJobName(),job.getGroup());
        scheduler.deleteJob(jobKey);

    }

    /**
     * 定时任务只执行一次
     * @param scheduler
     * @param job
     * @throws SchedulerException
     */
    public static void runJobOnce(Scheduler scheduler, JobTask job) throws SchedulerException {
        JobKey jobKey=JobKey.jobKey(job.getJobName(),job.getGroup());
        scheduler.triggerJob(jobKey);

    }

    /**
     * 修改任务
     * @param scheduler
     * @param job
     */
    public static void modifyJob(Scheduler scheduler,JobTask job) throws SchedulerException {

        //获取触发器名称(唯一标识符)
        TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName() + "_trigger");

        //通过triggerKey名称获取到该触发器
        CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);

        //创建新的触发器
        CronTrigger newTrigger =trigger.getTriggerBuilder()
                .withSchedule(CronScheduleBuilder.cronSchedule(job.getCron()).withMisfireHandlingInstructionDoNothing())
                .build();

        //withMisfireHandlingInstructionDoNothing 不使用错过补偿机制

        //更新调度器
        scheduler.rescheduleJob(triggerKey,newTrigger);

    }
}

业务类

执行任务的逻辑

/**
 * 短信下发任务类
 */
public class SMSBelow implements Job {
    //执行任务
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        /***
         * 短信下发的逻辑
         */
        System.out.println("任务已完成");
    }
}

创建WEB接口

@RestController
@RequiredArgsConstructor
public class QuartzTask {

    private final Scheduler scheduler;

    //添加任务
    @GetMapping("/addTask")
    public String setTask() throws SchedulerException {
        JobTask task =new JobTask("13888888","0/3 * * * * ?","sms-exp");
       JobUtils.createJob(scheduler,task, SMSBelow.class);
        return "成功";
    }

    //删除任务
    @GetMapping("/deleteTask")
    public String deleteTask() throws SchedulerException {
        JobTask task =new JobTask("13888888",null,"sms-exp");
        JobUtils.deleteJob(scheduler,task);
        return "成功";
    }

//    //执行一次任务
//    @GetMapping("/runJobOnce")
//    public String runJobOnce() throws SchedulerException {
//        JobTask task =new JobTask("13888888",null,"sms-exp");
//        JobUtils.runJobOnce(scheduler,task);
//        return "成功";
//    }
//


    //修改任务
    @GetMapping("/modifyJob")
    public String modifyJob() throws SchedulerException {
        JobTask task =new JobTask("13888888","0/10 * * * * ?","sms-exp");
        JobUtils.modifyJob(scheduler,task);
        return "成功";
    }

    
}


任务触发器分离

//创建调度器
private static JobDetail createJobDetail(JobTask job, Class<? extends Job> jobClass){
    return  JobBuilder.newJob(jobClass)
            .storeDurably() //持久化
            .withIdentity(job.getJobName(), job.getGroup())
            .build();
}


//创建调度器
private static Trigger createTrigger(JobTask job,Class<? extends Job> jobClass)  {
    return  TriggerBuilder.newTrigger()
            .withIdentity(job.getJobName()+"_trigger") //触发器的 任务名 和 任务组 (起到标识作用)
            .forJob(createJobDetail(job,jobClass)) //触发(到时间)执行哪个任务
            .withSchedule(CronScheduleBuilder.cronSchedule(job.getCron())) //具体执行的时间 cro表达式
            .build();
}


/**
 * 创建定时任务
 * @param scheduler 调度器
 * @param job 任务实体
 */
public static void createJob(Scheduler scheduler, JobTask job, Class<? extends Job> jobClass) throws SchedulerException {
    JobDetail jobDetail=createJobDetail( job, jobClass);
    Trigger trigger=createTrigger(job,jobClass);
    scheduler.scheduleJob(jobDetail,trigger);
}

你可能感兴趣的:(Quartz,Spring,Boot,java,python,算法,大数据,数据库,后端,tomcat)