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

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

1.首先是引入依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.dwl</groupId>
    <artifactId>minaproject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
    </dependencies>
</project>

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 QuatrzManager {

    //任务组名
    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<Trigger> 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) {
        //每五秒执行一次
        QuatrzManager.addJob("test",TestJob.class,"*/5 * * * * ?");
    }
}


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

猜你喜欢

转载自blog.csdn.net/DWL0208/article/details/81775912