使用Quartz搭建定时任务脚手架
定时任务的实现有很多种,在Spring项目中使用一个注解 @Scheduled就可以很快搞定。
但是很难去管理项目中的定时任务,比如说:系统中有多少定时任务,每个定时任务执行规则,修改执行规则,暂停任务,移除任务。
这个时候我们就可以使出杀手锏了,使用Quartz框架,整合到SpringBoot中,是个不错的选择。
最近一段时间,使用SpringBoot + Quartz,整合了一个小项目,专门用来管理定时任务,其中,从截图中可以看出来,可以对定时任务进行添加,查询,暂停,恢复,编辑,移除。
import java.util.ArrayList;
import java.util.Date;
import java.util.List; 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.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import com.bm.task.annotions.JobDeclare;
import com.bm.task.utils.TaskUtil;
import com.bm.task.utils.TimeUtil;
import com.bm.task.vo.JobDetailVO; @Component
public class QuartzManager { @Autowired
private Scheduler scheduler; /**
* 添加一个定时任务
*
* @param jobName 任务名
* @param jobGroupName 任务组名
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
* @param jobClass 任务
* @param cron 时间设置,参考quartz说明文档
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public void addJob(String jobName, String jobGroupName, String triggerName,
String triggerGroupName,String cron,String cronDesc) {
try { Class clazz = TaskUtil.getClass(jobName);
JobDeclare jobDeclare = (JobDeclare)clazz.getAnnotation(JobDeclare.class);
String jobDescription = jobDeclare.description(); // 任务名,任务组,任务执行类
JobDetail jobDetail= JobBuilder.newJob(clazz)
.withIdentity(jobName, jobGroupName)
.withDescription(jobDescription).build(); // 触发器
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
// 触发器名,触发器组
triggerBuilder.withIdentity(triggerName, triggerGroupName)
.withDescription(cronDesc);
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 (Exception e) {
throw new RuntimeException(e);
}
} /**
* 修改一个任务的触发时间
*
* @param jobName
* @param jobGroupName
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
* @param cron 时间设置,参考quartz说明文档
*/
public void modifyJobTime(String jobName, String jobGroupName, String triggerName,
String triggerGroupName, String cron,String cronDesc) {
try {
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,
triggerGroupName);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(cron)) {
/** 方式一 :调用 rescheduleJob 开始 */
// 触发器
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
// 触发器名,触发器组
triggerBuilder.withIdentity(triggerName, triggerGroupName)
.withDescription(cronDesc);
triggerBuilder.startNow();
// 触发器时间设定
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
// 创建Trigger对象
trigger = (CronTrigger) triggerBuilder.build();
// 方式一 :修改一个任务的触发时间
scheduler.rescheduleJob(triggerKey, trigger);
scheduler.pauseTrigger(triggerKey);// 停止触发器
/** 方式一 :调用 rescheduleJob 结束 */ /** 方式二:先删除,然后在创建一个新的Job */
//removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
//addJob(jobName, jobGroupName, triggerName, triggerGroupName, cron,cronDesc);
/** 方式二 :先删除,然后在创建一个新的Job */
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* 移除一个任务
*
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
*/
public void removeJob(String jobName, String jobGroupName,String triggerName,
String triggerGroupName) {
try {
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,
triggerGroupName);
scheduler.pauseTrigger(triggerKey);// 停止触发器
scheduler.unscheduleJob(triggerKey);// 移除触发器
scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 删除任务
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* 暂停一个任务
*
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
*/
public void pauseJob(String triggerName, String triggerGroupName) {
try {
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,
triggerGroupName);
scheduler.pauseTrigger(triggerKey);// 停止触发器
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* 恢复一个任务
*
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
*/
public void resumeJob(String triggerName, String triggerGroupName) {
try {
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,
triggerGroupName);
scheduler.pauseTrigger(triggerKey);// 停止触发器
scheduler.resumeTrigger(triggerKey);
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* 获取所有的JobDetail
*/
public List<JobDetailVO> getJobs() throws SchedulerException {
List<JobDetailVO> result = new ArrayList<>();
List<String> groupNames = scheduler.getJobGroupNames();
for (String groupName : groupNames) {
Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
for (JobKey jobKey : jobKeys) {
String jobName = jobKey.getName();
String jobGroup = jobKey.getGroup();
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
// get job's trigger
@SuppressWarnings("unchecked")
List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey);
CronTrigger trigger = (CronTrigger)triggers.get(0);
String cronExpression = trigger.getCronExpression();
Date lastFireTime = trigger.getPreviousFireTime();
Date nextFireTime = triggers.get(0).getNextFireTime();
JobDetailVO vo = new JobDetailVO();
vo.setCronExpression(cronExpression);
vo.setJobDescription(jobDetail.getDescription());
vo.setJobName(jobName);
vo.setJobGroupName(jobGroup);
if(lastFireTime != null) {
vo.setLastFireTime(
TimeUtil
.getStringFromTime(lastFireTime,
TimeUtil.TIME_FORMAT_SHOW_MILLISECOND_WITH_COLON));
}
if(nextFireTime != null) {
vo.setNextFireTime(TimeUtil
.getStringFromTime(nextFireTime,
TimeUtil.TIME_FORMAT_SHOW_MILLISECOND_WITH_COLON));
}
vo.setTriggerDescription(trigger.getDescription());
vo.setTriggerName(trigger.getKey().getName());
vo.setTriggerGroupName(trigger.getKey().getGroup());
vo.setTriggerState(scheduler.getTriggerState(trigger.getKey()).name());
result.add(vo);
}
}
return result;
} }
使用Quartz搭建定时任务脚手架的更多相关文章
- Quartz.net 定时任务之Cron表达式
一.cron表达式简单介绍和下载 1.在上一篇博客"Quartz.net 定时任务之简单任务"中,我简单介绍了quartz的使用,而这篇博客我将介绍cron的具体使用(不足之处望大 ...
- 使用Quartz创建定时任务
项目开发中经常需要定时循环执行某些任务 比如定时发送报表,定时发送邮件,亦或者定时清理缓存,定时更新数据等等 有些时候可以简单地利用Windows Server的计划任务执行程序 Linux也有相应的 ...
- springboot整合Quartz实现定时任务
1.maven依赖: <!--quartz--> <dependency> <groupId>org.quartz-scheduler</groupId> ...
- Spring+Quartz 实现定时任务的配置方法
Spring+Quartz 实现定时任务的配置方法 整体介绍 一.Quartz介绍 在企业应用中,我们经常会碰到时间任务调度的需求,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等.Quartz是 ...
- Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置
Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...
- 【spring-boot】 springboot整合quartz实现定时任务
在做项目时有时候会有定时器任务的功能,比如某某时间应该做什么,多少秒应该怎么样之类的. spring支持多种定时任务的实现.我们来介绍下使用spring的定时器和使用quartz定时器 1.我们使用s ...
- Spring Boot集成quartz实现定时任务并支持切换任务数据源
org.quartz实现定时任务并自定义切换任务数据源 在工作中经常会需要使用到定时任务处理各种周期性的任务,org.quartz是处理此类定时任务的一个优秀框架.随着项目一点点推进,此时我们并不满足 ...
- SpringBoot集成Quartz实现定时任务
1 需求 在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计.我的设计是按天统计每种状态的比例.为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态.另外,考 ...
- Quartz:定时任务工具类
Quartz:定时任务工具类 Quartz工具类 Quartz工具类 import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; ...
随机推荐
- 将数据库从Oracle迁移到SQL Server
参考链接:http://www.360doc.com/content/15/0310/14/9260775_454038517.shtml
- Oracle查询表主键、外键
项目中用到的一些Sql(oracle下的)总结: 1.查找表的所有索引(包括索引名,类型,构成列) select t.*,i.index_type from user_ind_columns t,us ...
- 目标检测-yolo2
转载自:http://blog.csdn.net/qq_34784753/article/details/78825493 对于现在的最好的检测系统来说,yolo_v1 的问题主要出现在两方面,也就是 ...
- 集合Arraylist的方法的使用和打印
package chapter090; import java.util.ArrayList;import java.util.List; public class TestList01 { publ ...
- 获取table行列
var table =document.getElementById("add_purchaseOrderDetailList_table"); var rows = table. ...
- Codeforces 460D Little Victor and Set(看题解)
Little Victor and Set 其他都很好求, 只有k == 3的时候很难受.. 我们找到第一个不大于l的 t, 答案为 l, 3 * t, (3 * t) ^ l 感觉好像是对的, 感觉 ...
- BZOJ1258 [CQOI2007]三角形tri 模拟
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1258 题意概括 这种图中,一个三角形的三边如果被其他某一个三角形的一条边包括,那么我们说该三角形和 ...
- 【noip模拟赛5】任务分配 降维dp
描述 现有n个任务,要交给A和B完成.每个任务给A或给B完成,所需的时间分别为ai和bi.问他们完成所有的任务至少要多少时间. 输入 第一行一个正整数n,表示有n个任务.接下来有n行,每行两个正整数a ...
- 6-2 铁轨 uva 514
较为简单的stack题目 但是还是犯了一些错误: 1. 要想清空栈,直接重新定义较为方便! 2.在if(s.top()==x)时 加上 !s.empty() 否则程序会崩溃 3. 必须要加上i- ...
- Redis数据结构之sorted-set
一:介绍 1.说明 与set的主要区别 sorted-set中的成员需要一个分数,分数可以重复的. 位置是有序的 二:Redis客户端 1.添加 如果key已经存在,再次添加一个key相同的,但是分部 ...