动态quartz新增、修改、删除
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新增、修改、删除的更多相关文章
- Oracle忘记用户名和密码以及管理员用户新增修改删除用户
Oracle忘记密码: 1.以管理员身份登录,打开dos窗口,输入 sqlplus / as sysdba 回车 2.查看当前用户和状态 select username, account_status ...
- MYSQL基础01(新增,修改,删除)
首先说明一下,本人之前一直都是用MSSQL,由于工作原因,每天写上百条sql语句,并持续了几年;由于换了工作目前主要接触的MYSQL;所以现在开始学习MYSQL. 我的学习计划很简单,我在MSSQL使 ...
- Java代码操作properties文件(读取,新增/修改,删除)
项目中需要用到操作properties文件中的数据,记录一下 package com.bonc.savepic.save; import java.io.FileNotFoundException; ...
- BizTalk 新增/修改/删除 XmlDocument 名字空间的高效方法
新增一个名字空间 public class AddXmlNamespaceStream : XmlTranslatorStream { private String namespace_; priva ...
- spring-data-jpa 新增 修改 删除 查询 分页
1.查询所有数据 findAll() 2.分页查询 findAll(new PageRequest(0, 2)) 3.根据id查询 findOne() 4.根据实体类属性查询: findByPro ...
- sql 新增 修改 删除 列操作
IF COL_LENGTH('SYS_Department', 'CreatedBy') IS NOT NULL --判断 SYS_Department 中是否存在 CreatedBy 字段 EXEC ...
- oracle 数据库更新 新增 修改 删除
数据增加 INSERT INTO 表名称 [(字段,字段,...)] VALUES (值,值,...) ; 考虑到日后代码的可维护性,一定要使用完整的语法进行数据的增加. 数据修改 UPDATE 表名 ...
- .net操作xml文件(新增.修改,删除,读取) 转
今天有个需求需要操作xml节点.突然见遗忘了许多.上网看了些资料.才整出来.脑袋真不够用.在这里把我找到的资料共享一下.方便以后使用.本文属于网摘/ 1 一.简单介绍2 using System.Xm ...
- SQL中插入单引号,新增修改删除
1.插入单引号如果不转化的话,字符串插入到数据库中错误的,只要在字符串中有单引号的地方在加一个单引号即可. 例如:在数据库插入'井下设备' : insert into Static_Bel ...
随机推荐
- Mysql event事件用法
公司的数据库需要进行定期删除数据,需要用到mysql event事件,学习和梳理这块知识. 1查看event是否开启 SHOW VARIABLES LIKE 'event_scheduler'; 2开 ...
- 201621123001 《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...
- GNU C的定义长度为0的数组
在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0];很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在 ...
- Appium Desktop 介绍及使用
一.AppiumDesktop介绍 1.Appium-server的图形界面.可以设置选项.启动/停止服务器.查看日志等功能:且无须提前安装Node / NPM,因为Node运行时直接与Appium ...
- L253 Work and Pleasure
To be really happy and really safe, one ought to have at least two or three hobbies, and they must a ...
- Python 数据处理库 pandas 入门教程
Python 数据处理库 pandas 入门教程2018/04/17 · 工具与框架 · Pandas, Python 原文出处: 强波的技术博客 pandas是一个Python语言的软件包,在我们使 ...
- 【转】Principles of training multi-layer neural network using backpropagation
Principles of training multi-layer neural network using backpropagation http://galaxy.agh.edu.pl/~vl ...
- tableView 分割线的处理
有时候根据UI设计图的需要我们需要对原生的TableView分割线做靠左,靠右的操作 在下面这个方法中实现即可. - (void)tableView:(UITableView *)tableView ...
- js的调用方式
1.元素绑定 给具体的元素绑定JS的事件 事件:由用户行为触发的操作(鼠标操作,键盘操作) 语法:<标签 事件函数名="JS代码"> et: onclick:单机事件 ...
- JAVA:形参与实参
今天百度startWith函数的用法,无意中看到了形参这个称呼,因此就去了解了下形参与实参. 在传值机制中,其实就是把变量b(实参)的地址传递给了形参(也就是实参跟形参都是用的同一个地址,在传值之前形 ...