定时任务的实现有很多种,在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搭建定时任务脚手架的更多相关文章

  1. Quartz.net 定时任务之Cron表达式

    一.cron表达式简单介绍和下载 1.在上一篇博客"Quartz.net 定时任务之简单任务"中,我简单介绍了quartz的使用,而这篇博客我将介绍cron的具体使用(不足之处望大 ...

  2. 使用Quartz创建定时任务

    项目开发中经常需要定时循环执行某些任务 比如定时发送报表,定时发送邮件,亦或者定时清理缓存,定时更新数据等等 有些时候可以简单地利用Windows Server的计划任务执行程序 Linux也有相应的 ...

  3. springboot整合Quartz实现定时任务

    1.maven依赖: <!--quartz--> <dependency> <groupId>org.quartz-scheduler</groupId> ...

  4. Spring+Quartz 实现定时任务的配置方法

    Spring+Quartz 实现定时任务的配置方法 整体介绍 一.Quartz介绍 在企业应用中,我们经常会碰到时间任务调度的需求,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等.Quartz是 ...

  5. Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...

  6. 【spring-boot】 springboot整合quartz实现定时任务

    在做项目时有时候会有定时器任务的功能,比如某某时间应该做什么,多少秒应该怎么样之类的. spring支持多种定时任务的实现.我们来介绍下使用spring的定时器和使用quartz定时器 1.我们使用s ...

  7. Spring Boot集成quartz实现定时任务并支持切换任务数据源

    org.quartz实现定时任务并自定义切换任务数据源 在工作中经常会需要使用到定时任务处理各种周期性的任务,org.quartz是处理此类定时任务的一个优秀框架.随着项目一点点推进,此时我们并不满足 ...

  8. SpringBoot集成Quartz实现定时任务

    1 需求 在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计.我的设计是按天统计每种状态的比例.为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态.另外,考 ...

  9. Quartz:定时任务工具类

    Quartz:定时任务工具类 Quartz工具类 Quartz工具类 import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; ...

随机推荐

  1. ADC自动转接功能Lua实现

    一.背景介绍: 虽然使用Mod_fifo和mod_callcenter可以做呼叫中心的应用,但在实现应用中,这两个模块很难客制化需求,再此我用Lua实现了5路客服(1000-1004),一个呼叫中心号 ...

  2. 转载:2.2.5 在配置中使用变量《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19630.html 有些模块允许在配置项中使用变量,如在日志记录部分,具体示例如下.log_format  main  '$remot ...

  3. WM8960音频播放

    第一节 音频播放原理首先需要申明一下,本章的代码来自网络,参考了亚嵌教育李明老师(论坛ID:limingth)的帖子: http://www.arm9home.net/read.php?tid=205 ...

  4. MySQL 数据类型(转)

    MySQL 数据类型 在 MySQL 中,有三种主要的类型:文本.数字和日期/时间类型. Text 类型: 数据类型 描述 备注 CHAR(size) 保存固定长度的字符串(可包含字母.数字以及特殊字 ...

  5. PYTHON-网络通信 TCP

    网络编程: 学习网络编程 为什么?目的: 服务端特点: 网络通讯(通信) 什么是网络通讯? 为什么?目的:网络建立的目的是为数据交互(通信) 如何实现通讯(通信)? 互联网协议 互联网=物理连接介质+ ...

  6. 【前端】三个bug

    目录 一.Array对象的indexOf() 二.使用jquery,clone()下拉框问题 三.jquery获取获取html5的data-*属性 一.Array对象的indexOf() 1.inde ...

  7. 《转》MySQL 5.7版本新特性连载

    MySQL 5.7版本新特性连载(一) 本文将和大家一起分享下5.7的新特性,不过我们要先从即将被删除的特性以及建议不再使用的特性说起.根据这些情况,我们在新版本及以后的版本中,应该不再使用,避免未来 ...

  8. xftp和xshell有什么区别

    XshellXshell是一个用于MS Windows平台的强大的SSH,TELNET,和RLOGIN终端仿真软件.它使得用户能轻松和安全地从Windows PC上访问Unix/Linux主机.Xft ...

  9. sed & awk常用正则表达式

    正则表达式元字符 正则表达式中有两种基本元素: 以字面值或变量表示的值(如.代表任意单个字符). 操作符(如*代表将前面的字符重复任意次). 元字符汇总 特殊字符 用途 . 匹配除换行符以外的任意单个 ...

  10. PyQt5初级教程(一)

    python 版qt入门级使用说明 我使用的是python3.5安装PyQt5: pip3 install PyQt5 可以用如下代码测试环境是否安装成功,运行成功会弹出一个窗口: from PyQt ...