使用quartz动态加载和删除定时任务

      在项目中越来越多的使用到定时任务,单个项目定时任务太多时就不好管理,这时我们可能需要将任务保存在数据库中,动态的去加载或删除某些定时任务。

1.首先是引入依赖。



    4.0.0

    com.dwl
    minaproject
    1.0-SNAPSHOT

    
        
            org.quartz-scheduler
            quartz
            2.2.1
        
    

2.任务调度管理类。

package com.mina.quatrz;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @program: minaproject
 * @description: 任务调度管理
 * @author: daiwenlong
 * @create: 2018-08-17 11:33
 **/
public class QuartzManager {

    //任务组名
    private static final String JOB_GROUP_NAME = "my_group";
    //触发器组名
    private static final String TRIGGER_GROUP_NAME = "my_trigger";
    //调度工厂
    private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();


    /**
    * @Description: 添加定时任务
    * @Param: [jobName:任务名, jobClazz:任务, cron:cron表达式]
    * @return: void
    * @Date: 2018/8/17
    */ 
    public static void addJob(String jobName ,Class jobClazz ,String cron){
        try {
            //获取Scheduler
            Scheduler scheduler = schedulerFactory.getScheduler();
            // 任务名,任务组,任务执行类
            JobDetail jobDetail= JobBuilder.newJob(jobClazz).withIdentity(jobName, JOB_GROUP_NAME).build();
            // 传参 可以不要
            jobDetail.getJobDataMap().put("repId", jobName);
            // 触发器
            TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
            // 触发器名,触发器组
            triggerBuilder.withIdentity(jobName, TRIGGER_GROUP_NAME);
            triggerBuilder.startNow();
            // 触发器时间设定
            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
            // 创建Trigger对象
            CronTrigger trigger = (CronTrigger) triggerBuilder.build();
            // 调度容器设置JobDetail和Trigger
            scheduler.scheduleJob(jobDetail, trigger);
            // 启动
            if (!scheduler.isShutdown()) {
                scheduler.start();
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Description: 删除定时任务
    * @Param: [jobName:任务名称]
    * @return: void
    * @Date: 2018/8/17
    */ 
    public static void removeJob(String jobName) {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME);
            scheduler.pauseTrigger(triggerKey);// 停止触发器
            scheduler.unscheduleJob(triggerKey);// 移除触发器
            scheduler.deleteJob(JobKey.jobKey(jobName, JOB_GROUP_NAME));// 删除任务
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Description: 启动所有任务
    * @Param: []
    * @return: void
    * @Date: 2018/8/17
    */ 
    public static void startJobs() {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Description:删除所有任务
    * @Param: []
    * @return: void
    * @Date: 2018/8/17
    */ 
    public static void shutdownJobs() {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            if (!scheduler.isShutdown()) {
                scheduler.shutdown();
            }
        } catch (SchedulerException e) {
           e.printStackTrace();
        }
    }

}


3.实现Job接口的任务类。

package com.mina.quatrz;

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

/**
 * @program: minaproject
 * @description: 测试Job
 * @author: daiwenlong
 * @create: 2018-08-17 12:43
 **/
public class TestJob implements Job {

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("执行成功----输出:"+System.currentTimeMillis());
    }
}


4.测试。

package com.mina.quatrz;

/**
 * @program: minaproject
 * @description: 测试
 * @author: daiwenlong
 * @create: 2018-08-17 12:42
 **/
public class Test {

    public static void main(String[] args) {
        //每五秒执行一次
        QuartzManager.addJob("test",TestJob.class,"*/5 * * * * ?");
    }
}


使用quartz动态加载和删除定时任务_第1张图片

5.使用QuatrzManager我们就可以动态的添加和删除定时任务啦。

你可能感兴趣的:(quartz)