1.定义job导出类

 public class MyQuartzJob implements Job {
private static Logger logger = LoggerFactory.getLogger(MyQuartzJob.class); @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()));
// JobDataMap jdm = context.getMergedJobDataMap(); JobDetailImpl jdi = (JobDetailImpl) context.getJobDetail(); JobKey jk = jdi.getKey(); String jobName = jk.getName();
String jobGroup = jk.getGroup(); Trigger trigger = context.getTrigger();
TriggerKey triggerKey = trigger.getKey(); String triggerName = triggerKey.getName();
String triggerGroup = triggerKey.getGroup(); if (jobName.equals("我的cron任务1")) {
try {
QuartzManager.modifyJobTime(triggerKey, "0 0/3 * * * ?");
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("当前执行的job是:" + jobName + ";job的组名是:" + jobGroup + ";trigger名称是:" + triggerName
+ ";trigger的组名是:" + triggerGroup + ";下次执行时间为:"
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(context.getNextFireTime()));
System.out.println();
// JobDetailImpl scheduleJob = (JobDetailImpl)
// context.getMergedJobDataMap().get("scheduleJob");
// System.out.println("任务名称 = [" + scheduleJob.getName() + "]"); /*
*从jobDataMap中取得推送相关的额外信息;
* */
JobDataMap dataMap = context.getMergedJobDataMap();
// userId
String userId = (String) dataMap.get("userId");
//
String messageTypes = (String) dataMap.get("messageTypes"); //下边的这里是项目的业务 就不贴出来了
// 根据用户id查询该用户定义的
// PushAlarmService alarmService = SpringUtils.getBean(PushAlarmService.class);
// alarmService.selByUserId(Integer.valueOf(userId)); }
}

2.定义一个定时器的管理类:专门负责定时器的新增、修改、删除、启动、结束等。

   import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory; public class QuartzManager {
// private static final String JOB_GROUP_NAME = "SDJK_APP_JOBGROUP_NAME";
/// private static String TRIGGER_GROUP_NAME = "SDJK_APP_TRIGGERGROUP_NAME";
public static StdSchedulerFactory sf = new StdSchedulerFactory();
// public static StdScheduler ss = (StdScheduler) SpringUtils.getBean("schedulerFactoryBean"); /**
*
* @Title:
* @Description: 创建SimpleTrigger定时器,startnow,run forever
*
* @param jobKey
* @param triggerKey
* @param cls
* @param repeatIntevalTime
* @throws SchedulerException
*/
public static void addJob(JobKey jobKey, TriggerKey triggerKey, Class<? extends Job> cls, int repeatIntevalTime,
JobDataMap jobDataMap) throws SchedulerException { Scheduler sched = sf.getScheduler(); JobDetail jd = JobBuilder.newJob(cls).withIdentity(jobKey).setJobData(jobDataMap).build();// jobDetail SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey)
.withSchedule(
SimpleScheduleBuilder.simpleSchedule().withIntervalInHours(repeatIntevalTime).repeatForever())
.startNow().build();// triggerkey用来标识trigger身份 sched.scheduleJob(jd, trigger);// 设置调度器 try { if (!sched.isShutdown()) {
sched.start();
} } catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
*
* @Title:
* @Description: 添加cronTrigger的定时器
*
* @param jobKey
* @param triggerKey
* @param jobClass
* @param cron
* @param JobDataMap
* jobDataMap
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void addJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron,
JobDataMap jobDataMap) {
try {
// 任务名,任务组,任务执行类;可以将自己需要的额外信息添加到jobdatamap中。
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobKey).setJobData(jobDataMap).build(); TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器 triggerBuilder.withIdentity(triggerKey);// 触发器名,触发器组 triggerBuilder.startNow();// 现在执行 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 触发器执行规则 CronTrigger trigger = (CronTrigger) triggerBuilder.build();// 创建CronTrigger对象 Scheduler sched = sf.getScheduler();// 创建调度器 sched.scheduleJob(jobDetail, trigger);// 调度容器设置JobDetail和Trigger if (!sched.isShutdown()) {// 启动
sched.start();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
*
* @Title:
* @Description: 修改cronTrigger定时器
*
* @param triggerKey
* trigger标识
* @param cron
* @throws SchedulerException
*/
public static void modifyJobTime(TriggerKey triggerKey, String cron) throws SchedulerException { Scheduler sched = sf.getScheduler(); try {
// TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); if (trigger == null) {
return;
} String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(cron)) { /** 方式一 :调用 rescheduleJob 开始 */
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器 triggerBuilder.withIdentity(triggerKey);// 触发器名,触发器组 triggerBuilder.startNow();// 立即执行 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 触发器时间设定 trigger = (CronTrigger) triggerBuilder.build();// 创建Trigger对象 sched.rescheduleJob(triggerKey, trigger);// 修改一个任务的触发时间 /** 方式一 :调用 rescheduleJob 结束 */ /** 方式二:先删除,然后在创建一个新的Job */
// JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
// Class<? extends Job> jobClass = jobDetail.getJobClass();
// removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
// addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
/** 方式二 :先删除,然后在创建一个新的Job */
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
*
* @Title:
* @Description: 只修改simpleTrigger触发器的触发时间,不更改trigger的triggerKey
*
* @param triggerKey
* trigger标识
* @param repeatIntervalTime
* 重复间隔时长
* @throws SchedulerException
*/
public static void modifyJobTime(TriggerKey triggerKey, int repeatIntervalTime) throws SchedulerException { Scheduler sched = sf.getScheduler(); try { SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(triggerKey); if (trigger == null) {
return;
} long oldTime = trigger.getRepeatInterval(); if (oldTime != repeatIntervalTime) { /** 方式一 :调用 rescheduleJob 开始 */
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器builder triggerBuilder.withIdentity(triggerKey);// 触发器名,触发器组 triggerBuilder.withSchedule(SimpleScheduleBuilder.repeatHourlyForever(repeatIntervalTime));// 更新触发器的重复间隔时间 triggerBuilder.startNow();// 立即执行 trigger = (SimpleTrigger) triggerBuilder.build();// 创建Trigger对象 sched.rescheduleJob(triggerKey, trigger);// 修改一个任务的触发时间 /** 方式一 :调用 rescheduleJob 结束 */ /** 方式二:先删除,然后在创建一个新的Job */
// JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
// Class<? extends Job> jobClass = jobDetail.getJobClass();
// removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
// addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
/** 方式二 :先删除,然后在创建一个新的Job */
} } catch (Exception e) {
throw new RuntimeException(e);
}
} /**
*
* @Title:
* @Description: 根据job和trigger删除任务
*
* @param jobKey
* @param triggerKey
*/
public static void removeJob(JobKey jobKey, TriggerKey triggerKey) { try { Scheduler sched = sf.getScheduler(); sched.pauseTrigger(triggerKey);// 停止触发器 sched.unscheduleJob(triggerKey);// 移除触发器 sched.deleteJob(jobKey);// 删除任务 } catch (Exception e) { throw new RuntimeException(e); }
} /**
* @Description:启动所有定时任务
*/
public static void startJobs(Scheduler sched) {
try {
sched.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* @Description:关闭所有定时任务
*/
public static void shutdownJobs(Scheduler sched) {
try {
if (!sched.isShutdown()) {
sched.shutdown();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
*
* @Title:
* @Description: 新增或者修改
*
* @param jobKey
* @param triggerKey
* @param clz
* @param intervalTime
* @param jobDataMap
* @throws SchedulerException
*/
public static void addOrModify(JobKey jobKey, TriggerKey triggerKey, @SuppressWarnings("rawtypes") Class clz,
int intervalTime, JobDataMap jobDataMap) throws SchedulerException { Scheduler sched = sf.getScheduler(); if (sched.checkExists(jobKey)) {// 如果存在,则modify一下job和trigger } if (sched.checkExists(triggerKey)) {// modify修改trigger modifyJobTime(triggerKey, intervalTime); } else {// add新增 addJob(jobKey, triggerKey, clz, intervalTime, jobDataMap); } }
}

可以看到,每次创建job是都要使用一个实现了job接口的类,这个类就是我们自己实现的job导出类。

3.初始定时任务的初始化类。作用:项目启动时,初始化自己定义的定时器。既然需要项目启动时就加载所有的定时器,那么需要在spring容器加载时一起加载。

 public class InitQuartzJob {

         /**
* @throws SchedulerException
* @Description:服务启动时,根据用户定义的推送规则,初始化所有的推送任务。每个用户选择自己的隧道,为每条隧道指定推送的间隔时间。 因此同一个用户可能有多个定时任务。
*/
public static void init() throws SchedulerException {
System.out.println("定时器初始化开始=============================="); JobDataMap dataMap1 = new JobDataMap();
dataMap1.put("subCode", "sdnanhuan");
dataMap1.put("messageType", "all");
JobKey jobKey1 = new JobKey("我的cron任务1", "我的cron任务组名1");
TriggerKey triggerKey1 = new TriggerKey("我的cron触发器名1", "我的cron触发器组名1"); JobKey jobKey2 = new JobKey("我的cron任务2", "我的cron任务组名1");// job的名字不能重复
TriggerKey triggerKey2 = new TriggerKey("我的cron触发器名2", "我的cron触发器组名2"); QuartzManager.addJob(jobKey1, triggerKey1, MyQuartzJob.class, "0 0/2 * * * ?", null);
QuartzManager.addJob(jobKey2, triggerKey2, MyQuartzJob.class, "0 0/2 * * * ?", null); }
}

4.最后就是在自己的业务系统里面,调用定时器工具类了。当业务提交后,如果需要创建或者修改定时器,直接在业务层调用工具类就可以了。

转载https://blog.csdn.net/Jatham/article/details/81384454

动态quartz新增、修改、删除的更多相关文章

  1. Oracle忘记用户名和密码以及管理员用户新增修改删除用户

    Oracle忘记密码: 1.以管理员身份登录,打开dos窗口,输入 sqlplus / as sysdba 回车 2.查看当前用户和状态 select username, account_status ...

  2. MYSQL基础01(新增,修改,删除)

    首先说明一下,本人之前一直都是用MSSQL,由于工作原因,每天写上百条sql语句,并持续了几年;由于换了工作目前主要接触的MYSQL;所以现在开始学习MYSQL. 我的学习计划很简单,我在MSSQL使 ...

  3. Java代码操作properties文件(读取,新增/修改,删除)

    项目中需要用到操作properties文件中的数据,记录一下 package com.bonc.savepic.save; import java.io.FileNotFoundException; ...

  4. BizTalk 新增/修改/删除 XmlDocument 名字空间的高效方法

    新增一个名字空间 public class AddXmlNamespaceStream : XmlTranslatorStream { private String namespace_; priva ...

  5. spring-data-jpa 新增 修改 删除 查询 分页

      1.查询所有数据 findAll() 2.分页查询 findAll(new PageRequest(0, 2)) 3.根据id查询 findOne() 4.根据实体类属性查询: findByPro ...

  6. sql 新增 修改 删除 列操作

    IF COL_LENGTH('SYS_Department', 'CreatedBy') IS NOT NULL --判断 SYS_Department 中是否存在 CreatedBy 字段 EXEC ...

  7. oracle 数据库更新 新增 修改 删除

    数据增加 INSERT INTO 表名称 [(字段,字段,...)] VALUES (值,值,...) ; 考虑到日后代码的可维护性,一定要使用完整的语法进行数据的增加. 数据修改 UPDATE 表名 ...

  8. .net操作xml文件(新增.修改,删除,读取) 转

    今天有个需求需要操作xml节点.突然见遗忘了许多.上网看了些资料.才整出来.脑袋真不够用.在这里把我找到的资料共享一下.方便以后使用.本文属于网摘/ 1 一.简单介绍2 using System.Xm ...

  9. SQL中插入单引号,新增修改删除

    1.插入单引号如果不转化的话,字符串插入到数据库中错误的,只要在字符串中有单引号的地方在加一个单引号即可.    例如:在数据库插入'井下设备' :    insert into Static_Bel ...

随机推荐

  1. JavaWeb基础-认识JavaWeb

    程序开发体系 B/S 浏览器/服务器 开发维护成本低 客户端负载低 安全性低 C/S 客户端/服务器 成本高 客户端负载高 安全性高 javaweb简介 静态网页 HTML CSS,人浏览的数据是始终 ...

  2. L252

    How often have you heard the saying, "Stop and smell the roses?" Odds are, you've come acr ...

  3. Python写一个批量生成账号的函数

    批量生成账户信息,产生的账户由@sina.com结尾,长度由用户输入,产生多少条也由用户输入,用户名不能重复,用户名必须由大写字母.小写字母和数字组成. def Users(num,len): # n ...

  4. idea本地安装 lombok插件

    转:https://blog.csdn.net/weixin_41404773/article/details/80689639 idea本地安装 lombok插件 项目中经常使用bean,entit ...

  5. Python基础3--Python复杂数据类型

    1 堆 堆是一种二叉树,其中每个父节点的值都小于或等于其所有子节点的值,最小的元素总是位于二叉树的根节点. 堆的创建 import heapq import random data = range(1 ...

  6. js常用到的方法积累

    //获取对象长度的方法 function countObjLen(obj) { var count = 0; for (var property in obj) { if (Object.protot ...

  7. 【Python】多进程1

    1.    进程定义: (1) 进程是一个实体.每个进程都有他自己的地址空间,一般包括文本区域.数据区域和堆栈.进程是线程的容器. (2) 进程是一个“执行中的程序” 2.    进程的特征: (1) ...

  8. SpringMVC详细示例实战教程(较全开发教程)

    SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...

  9. 强化学习中的无模型 基于值函数的 Q-Learning 和 Sarsa 学习

    强化学习基础: 注: 在强化学习中  奖励函数和状态转移函数都是未知的,之所以有已知模型的强化学习解法是指使用采样估计的方式估计出奖励函数和状态转移函数,然后将强化学习问题转换为可以使用动态规划求解的 ...

  10. PDO数据库引擎

    PDO概述1.PDO是一种数据库访问抽象层,你不必使用以前的 mysqli_xx 之类只能访问 mysql数据库.使用PDO可以连接mysql.msssql.oracle等等,而不必重写代码.2.PD ...