任务调度开源框架Quartz动态添加、删除、修改任务

简介: 任务调度开源框架Quartz动态添加、删除、修改任务

任务调度开源框架Quartz动态添加、删除、修改任务

如题所示,本篇的主要内容是介绍如何对quratz的任务动态添加、删除及修改

  • 首先我写了一个任务管理的接口,里面有对job的一些操作方法
package com.hrt.quartz;
import java.text.ParseException;
import java.util.List;
import java.util.Date;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
/**
 * 定时任务管理
 * @author JP
 *
 */
public interface QuartzManager {
    /**
     *   添加简单任务,只运行一次的任务
     * @param jobname
     * @param jobGroup
     * @param jobClass
     * @param runTime  格式 :yyyyMMddHHmmss
     * @param arrayParam
     */
 public void addSimpleJob(String jobname, String jobGroup, Class jobClass, Date runTime, List arrayParam); 
   /**
    * 添加循环任务,特定时间循环运行,例如每个星期3,12点运行等
    * @param jobname
    * @param jobGroup
    * @param jobClass
    * @param crontime
    * @param arrayParam
    */
  public void addCronJob(String jobname,String jobGroup,Class jobClass,String crontime,List arrayParam);
  /**
   * 修改简单任务,一般指修改运行的时间
   * @param jobName
   * @param jobGroup
   * @param runDateTime
   */
  void updateSimpleJob(String jobName, String jobGroup, Date runDateTime);
  /**
   * 修改cron任务,一般指修改循环运行时间
   * @param jobName
   * @param jobGroup
   * @param cronTime
   */
  public void updateCronJob(String jobName, String jobGroup, String cronTime);
  /**
   * 移除所有任务
   */
  public void deleteAll();
  /**
   * 移除任务
   * @param jobName
   * @param jobGroup
   */
  public void deleteJob(String jobName, String jobGroup);
  /**
   * 暂停任务
   * @param jobName
   * @param jobGroup
   */
  public void pauseJob(String jobName, String jobGroup);
  /**
   * 暂停所有任务
   */
  public void pauseAll();
  /**
     * 恢复某个任务
     *
     * @param jobName
     * @param jobGroup
     */
    public void resumeJob(String jobName, String jobGroup) ;
    /**
     * 恢复所有
     */
    public void resumeAll() ;
    /**
     * 关闭任务调度器
     */
    public void shutDown();
    /**
     * 开启任务调度器
     */
    public void startScheduler() ;
}

然后就是去实现这个接口里的方法,方便后面使用

package com.hrt.quartz;
import java.util.List;
import java.util.Set;
import java.util.ArrayList;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.GroupMatcher;
import org.quartz.impl.triggers.CronTriggerImpl;
public class QuartzManagerImpl implements QuartzManager{
   private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); 
   /**
       *   添加简单任务,只运行一次的任务
       * @param jobname
       * @param jobGroup
       * @param jobClass
       * @param runTime  格式 :Date
       * @param arrayParam
       */
  @Override
  public  void addSimpleJob(String jobname, String jobGroup, Class jobClass, Date runTime, List arrayParam) {
    // TODO Auto-generated method stub
     try {
      Scheduler sched = gSchedulerFactory.getScheduler();
      //判断是否已存在相同jobName,jobGroup,若存在则删除
      if(sched.getJobDetail(JobKey.jobKey(jobname,jobGroup))!=null) {
          deleteJob(jobname, jobGroup);
      }
      JobDetail jobDetail=JobBuilder.newJob(jobClass)
          .withIdentity(jobname, jobGroup)
          .build();
      jobDetail.getJobDataMap().put("scheduleJob",arrayParam);
       //创建SimpleTrigger,在特定时间仅运行一次
          SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity(jobname, jobGroup).
                  startAt(runTime).build();
          sched.scheduleJob(jobDetail, trigger);
       // 启动  
          if(!sched.isShutdown()) {
            sched.start();
          }
    } catch (SchedulerException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }  
  }
  @Override
  public void addCronJob(String jobname, String jobGroup, Class jobClass, String crontime, List arrayParam) {
    // TODO Auto-generated method stub
     try {
        Scheduler sched = gSchedulerFactory.getScheduler();
        //判断是否已存在相同jobName,jobGroup,若存在则删除
        if(sched.getJobDetail(JobKey.jobKey(jobname,jobGroup))!=null) {
            deleteJob(jobname, jobGroup);
        }
        JobDetail jobDetail=JobBuilder.newJob(jobClass)
            .withIdentity(jobname, jobGroup)
            .build();
        jobDetail.getJobDataMap().put("scheduleJob",arrayParam);
         //创建CronTrigger,在特定时间循环运行
         CronTrigger trigger =  (CronTrigger) TriggerBuilder.newTrigger().withIdentity(jobname, jobGroup)
             .withSchedule(CronScheduleBuilder.cronSchedule(crontime))// 日历
              .build();
            sched.scheduleJob(jobDetail, trigger);
         // 启动  
            if(!sched.isShutdown()) {
              sched.start();
            }
      } catch (SchedulerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }  
  }
  /**
   * 修改SimpleJob任务时间
   */
  @Override
  public void updateSimpleJob(String jobName, String jobGroup, Date runDateTime) {
    // TODO Auto-generated method stub
    try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
           SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(triggerKey);  
            if (trigger == null) {  
                return;  
            }  
            // 触发器  
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
            // 触发器名,触发器组  
            triggerBuilder.withIdentity(jobName, jobGroup);
            // 触发器时间设定  
            triggerBuilder.startAt(runDateTime);
            // 创建Trigger对象
            trigger = (SimpleTrigger) triggerBuilder.build();
            // 按新的触发器重新设置Job执行
            sched.rescheduleJob(triggerKey, trigger);
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
  }
  /**
   * 修改CronJob  任务周期
   */
  @Override
  public void updateCronJob(String jobName, String jobGroup, String cronTime) {
    // TODO Auto-generated method stub
       try {  
              Scheduler sched = gSchedulerFactory.getScheduler();  
              TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
              CronTrigger trigger = (CronTrigger)sched.getTrigger(triggerKey); 
              if (trigger == null) {  
                  return;  
              }  
              String oldTime = trigger.getCronExpression();  
              if (!oldTime.equalsIgnoreCase(cronTime)) { 
                  // 触发器  
                  TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                  // 触发器名,触发器组  
                  triggerBuilder.withIdentity(jobName, jobGroup);
                  triggerBuilder.startNow();
                  // 触发器时间设定  
                  triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cronTime));
                  // 创建Trigger对象
                  trigger = (CronTrigger) triggerBuilder.build();
                  // 按新的触发器重新设置Job执行
                  sched.rescheduleJob(triggerKey, trigger);
              }  
          } catch (Exception e) {  
              throw new RuntimeException(e);  
          }  
  }
   /**
    * 删除任务组名为group_1的所有任务
    */
  @Override
  public void deleteAll() {
    // TODO Auto-generated method stub
    try {  
         Scheduler sched = gSchedulerFactory.getScheduler();  
       GroupMatcher<JobKey> matcher = GroupMatcher.groupEquals("group_1");  //得修改
             Set<JobKey> jobkeySet = sched.getJobKeys(matcher);
             List<JobKey> jobkeyList = new ArrayList<JobKey>();
             jobkeyList.addAll(jobkeySet);
             sched.deleteJobs(jobkeyList);
             System.out.println("删除所有组别为group_1的任务");
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
  }
  /**
   * 删除单个任务
   */
  @Override
  public void deleteJob(String jobName, String jobGroup) {
    // TODO Auto-generated method stub
    try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
          sched.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroup));// 停止触发器 
          sched.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroup));// 移除触发器  
          sched.deleteJob(JobKey.jobKey(jobName, jobGroup));// 删除任务  
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
  }
  /**
   * 关闭所有定时器
   */
  @Override
  public void shutDown() {
    // TODO Auto-generated method stub
      try {  
              Scheduler sched = gSchedulerFactory.getScheduler();  
              if (!sched.isShutdown()) {  
                  sched.shutdown();  
              }  
          } catch (Exception e) {  
              throw new RuntimeException(e);  
          }  
  }
  /**
   * 启动所有的定时器
   */
  @Override
  public void startScheduler() {
    // TODO Auto-generated method stub
     try {  
              Scheduler sched = gSchedulerFactory.getScheduler();  
              sched.start();  
          } catch (Exception e) {  
              throw new RuntimeException(e);  
          }  
  }
   /**
    * 暂停单个任务
    */
  @Override
  public void pauseJob(String jobName, String jobGroup) {
    // TODO Auto-generated method stub
     try {  
              Scheduler sched = gSchedulerFactory.getScheduler();  
              sched.pauseJob(JobKey.jobKey(jobName, jobGroup));
              sched.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroup));
          } catch (Exception e) {  
              throw new RuntimeException(e);  
          }  
  }
 /**
  * 暂停所有任务
  */
  @Override
  public void pauseAll() {
    // TODO Auto-generated method stub
    try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
           sched.pauseAll();
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
  }
  /**
   * 恢复单个任务
   */
  @Override
  public void resumeJob(String jobName, String jobGroup) {
    // TODO Auto-generated method stub
    try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
          sched.resumeJob(JobKey.jobKey(jobName, jobGroup));
          sched.resumeTrigger(TriggerKey.triggerKey(jobName, jobGroup));
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
  }
 /**
  * 恢复所有任务
  */
  @Override
  public void resumeAll() {
    // TODO Auto-generated method stub
    try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
            sched.resumeAll();
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
  }
}

再去弄一个具体的job类,去执行具体的工作

import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class QuartzJob implements Job{
  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    // TODO Auto-generated method stub
     System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ ".........");    
  }
}

接下来就是去调用方法,动态的管理任务。这里我就写了两种触发器添加任务的方法,其他方法可自己调用测试。

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.hrt.quartz.QuartzJob;
import com.hrt.quartz.QuartzManager;
import com.hrt.quartz.QuartzManagerImpl;
import com.hrt.util.DateCron;
public class TestQuartz {
  public static void main(String[] args) {
    executeSimpleJob();//以Simple触发器添加的定时任务
    executeCronJob(); //以Cron触发器添加的定时任务
    //QuartzManager q=new QuartzManagerImpl();
      //q.deleteAll(); 删除所有
  }
  //测试SImpleJob方法
  public static void executeSimpleJob() {
    QuartzManagerImpl q=new QuartzManagerImpl();
        String job_name="一个simpleJob任务";
        String jobGroup="Group12";
         //指定执行时间
        String time="2019-01-23 16:07:31";
      DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            //字符时间转时间类型
            date = format.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("Simple【系统启动】开始在2019-01-23 16:07:31执行");    
        //传参
       List list=new ArrayList<>();
        q.addSimpleJob(job_name, jobGroup, QuartzJob.class, date, list);
        //q.deleteJob(job_name, jobGroup);
  }
  //测试CronJob方法
  public static void executeCronJob() {
    QuartzManagerImpl q=new QuartzManagerImpl();
        String job_name="Cron触发器在指定时间循环执行";
        String jobGroup="Group12";
/*        //转换出Cron时间
      String Crontime=DateCron.cronTime(date, "1");
      System.out.println("Cron时间表达试:" +Crontime);*/
       String str="0/5 * * * * ? ";
       System.out.println("CronJOb【系统启动】(每5秒输出一次)...");    
       List list=new ArrayList<>();
      q.addCronJob(job_name, jobGroup, QuartzJob.class, str, list);
        //q.deleteJob(job_name, jobGroup);
  }
}

测试结果如下:

20200401134307494.png

有兴趣的老爷,可以关注我的公众号【一起收破烂】,回复【006】获取2021最新java面试资料以及简历模型120套哦~

相关文章
|
应用服务中间件 Linux 网络安全
Linux 安装 Nginx 并配置为系统服务(超详细)
Linux 安装 Nginx 并配置为系统服务(超详细)
|
Java Docker 容器
Docker 安装 JDK
一、查看 JDK 版本 访问 JDK 镜像库地址:https://hub.docker.com/_/openjdk/tags。 可以通过 Tags 查看其他版本的 JDK,默认是最新版本 open:idk ,你也可以在下拉列表中找到其他你想要的版本。 二、拉取 JDK 镜像 拉取 jdk8 的镜像: docker pull openjdk:8 这将从Docker Hub上拉取名为"openjdk"的官方仓库中的JDK 8镜像。一旦拉取完成,您就可以在容器中使用JDK 8了。 三、查看已下载的镜像 使用docker images命令可以列出所有本地已下载的Docker镜像: docker ima
5843 1
支付系统39----支付宝支付,定时查单,每隔30秒执行1次,查询超过5分钟,并且未支付的订单
支付系统39----支付宝支付,定时查单,每隔30秒执行1次,查询超过5分钟,并且未支付的订单
|
前端开发 easyexcel Java
Java+EasyExcel实现文件导入导出,导入导出如此简单
项目中需要Excel文件的导入与导出Excel并下载,例如,导入员工信息,导出员工信息,手动输入比较繁琐,所以本篇博文教大家如何在Java中导入Excel文件与导出Excel文件
16091 3
Java+EasyExcel实现文件导入导出,导入导出如此简单
|
SQL API 调度
Springboot2.4.5集成Quartz实现动态任务数据持久化-不怕重启服务
Springboot2.4.5集成Quartz实现动态任务数据持久化-不怕重启服务
1453 0
|
搜索推荐 API 开发者
京东商品详情优惠券API接口全攻略
京东商品详情优惠券API接口为电商开发者和商家提供了精准查询、获取详细信息及实时监测优惠券状态的功能。通过商品ID,可筛选出特定商品的定向或店铺通用优惠券,获取面额、使用门槛、领取条件等详尽信息,并监测优惠券的领取情况。该接口支持多种筛选参数,满足个性化需求,助力电商业务拓展与创新。示例代码展示了如何使用Python调用此接口,实现优惠券信息的高效获取。
1044 23
|
人工智能
科技赋能妇产医疗,钉钉联合打造小红 AI 患者助理
复旦大学附属妇产科医院与钉钉共同打造的 AI 助理“小红”上线。“小红”孵化于钉钉智能化底座,通过学习复旦大学附属妇产科医院的 400 多篇科普知识,涵盖妇科疾病宣教、专业产科指导、女性健康保健等问题,能够为患者提供妇科疾病、产科指导、女性健康保健等知识的专业解答。
655 11
|
存储 Cloud Native Java
Windows下Minio的安装以及基本使用
MinIO 是一个开源的云原生分布式对象存储系统,兼容亚马逊S3接口,适合存储大容量非结构化数据。本文介绍Windows下MinIO的安装与基本使用:通过以上步骤,您可以在Windows环境中成功安装并使用MinIO。
9989 19

热门文章

最新文章

下一篇
开通oss服务