Quartz的简单使用
一、Quartz 介绍
Quartz是Java领域最著名的、功能丰富的、开放源码的作业调度工具,几乎可以在所有的Java应用程序中集成——从小的单机应用到大的电子商务系统。 Quartz可以用来执行成百上千甚至数万的级别的、简单或者复杂的作业调度,一个Job可以执行任意的你所编程的任务。 Quartz调度包括许多企业级功能,如JTA事务和集群支持。
Quartz的主要角色有:
- Job:被调度的任务,重写其中execute方法,每次调度时会执行该方法;
- JobDetail:一个Job的具体化,可以这么看,JobDetail = Job + JobData
- Scheduler:调度器
- SchedulerFactory:调度工厂
- 各种ScheduleBuilder:CronScheduleBuilder(支持cron表达式的调度器)、CalendarIntervalScheduleBuilder(支持时间间隔的调度器)、SimpleScheduleBuilder(最简单的触发器,可以设置间隔,重复次数)
- Trigger:触发器,用于定义任务调度和时间规则,可以这么看,Trigger = ScheduleBuilder + Time
每个JobDetail都可以被唯一标识且指定一个抽象的Job,每个Trigger也都可以被唯一标识,Scheduler将JobDetail和Trigger绑定在了一起,即当trigger发生时,会调用JobDetail对应的Job的execute方法。
可以看一下这篇博文的对Quartz 简单介绍:
http://qiaowei.xyz/2016/05/11/Java%E4%BD%BF%E7%94%A8quartz%E5%AE%9E%E7%8E%B0%E4%BD%9C%E4%B8%9A%E8%B0%83%E5%BA%A6/#
另外,还可以看看并发编程网上的系列教程:http://ifeve.com/quartz-tutorial-using-quartz/
二、项目实战
项目使用到的代码,简单地罗列一下。
1.获取Scheduler的工具类
public class QuartzScheduleUtils {
private static Logger logger = LoggerFactory.getLogger(QuartzScheduleUtils.class);
private volatile static Scheduler scheduler;
public static Scheduler getInstanceScheduler(){
if(scheduler == null){
synchronized (QuartzScheduleUtils.class){
if (scheduler == null) {
SchedulerFactory sf = new StdSchedulerFactory();
try {
scheduler = sf.getScheduler();
} catch (SchedulerException e) {
logger.error("获取Schedule时抛错:", e);
}
}
}
}
return scheduler;
}
}
2.命名相关的工具类
public class ScheduleNameUtils {
public static String getJobName(String taskSubId){
return taskSubId + "Job";
}
public static String getTriggerName(String taskSubId){
return taskSubId + "Trigger";
}
public static String getGroupName(String taskId){
return "group_" + taskId;
}
}
3.实现Job
这里需要实现org.quartz.Job接口,实现execute方法
public class ScheduleJob implements Job {
private static final Logger LOG = LoggerFactory.getLogger(ScheduleJob.class);
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
String json = jobDataMap.getString("taskInfoDtoJson");
if (StringUtils.isBlank(json)) {
return;
}
// TODO: what you want to do.
}
}
4.执行定时任务
public void doJob() throws Exception {
Scheduler scheduler = QuartzScheduleUtils.getInstanceScheduler();
scheduler.start();
JobDetail job = JobBuilder.newJob(ScheduleJob.class)
.withIdentity(ScheduleNameUtils.getJobName(this.getTaskSubId())
, ScheduleNameUtils.getGroupName(this.getTaskId()))
.usingJobData("taskInfoDtoJson", JSON.toJSONString(taskInfoDto))
.build();
CronScheduleBuilder cronScheduleBuilder = null;
try {
cronScheduleBuilder = CronScheduleBuilder.cronSchedule(taskInfoDto.getCron());
} catch (Exception e) {
LOG.error("创建trigger的cron有问题:{}", e);
}
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(ScheduleNameUtils.getTriggerName(this.getTaskSubId()),
ScheduleNameUtils.getGroupName(this.getTaskId()))
.startNow()
.withSchedule(cronScheduleBuilder)
.build();
try {
scheduler.scheduleJob(job, trigger);
} catch (SchedulerException e) {
LOG.error("执行定时调度任务,job={}, trgger={},抛错:{}", job, trigger, e);
}
// 某种情况下,需要取消定时任务
cancelScheduleJob(taskInfoDto.getTaskId(), taskInfoDto.getTaskSubId());
}
/**
* 取消定时任务
*
* @param taskId
* @param taskSubId
* @return
*/
public boolean cancelScheduleJob(String taskId, String taskSubId) {
Scheduler scheduler = null;
scheduler = QuartzScheduleUtils.getInstanceScheduler();
if (scheduler == null) {
return false;
}
boolean isSuc = false;
TriggerKey triggerKey = new TriggerKey(ScheduleNameUtils.getTriggerName(taskSubId),
ScheduleNameUtils.getGroupName(taskId));
try {
isSuc = scheduler.unscheduleJob(triggerKey);
} catch (SchedulerException e) {
LOG.error("移除任务时抛错:{}", e);
}
return isSuc;
}Quartz的简单使用的更多相关文章
- 基于Quartz实现简单的定时发送邮件
一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...
- Quartz定时任务简单实例
文章纲要: 初步搭建一个由Quartz为引擎集群的定时任务模块,功能为每隔30秒打印一条信息(Hello World!!!) 一.环境 Spring MVC Mevan Quartz 2.2.1 二. ...
- C#中Quartz的简单易懂定时任务实现
作为一个优秀的开源调度框架,Quartz 具有以下特点: 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求: 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种 ...
- Quartz SpringBoot 简单整合一下
一次简单的代码整合记录. 数据库准备 如果是MySQL可能出现一些小问题.比如联合主键长度超限制,已经记录解决办法了. CREATE TABLE QRTZ_JOB_DETAILS ( SCHED_NA ...
- Quartz.Net简单使用
Quartz.Net为开源的作业调度框架,使用方便,实现IJob接口,及相关配置,即可实现调度. 项目包安装: install-package Quartz install-package log4n ...
- quartz 的简单使用
0.依赖: <!-- 引入quartz对应的依赖 --> <dependency> <groupId>org.quartz-scheduler</groupI ...
- 使用Quartz Job 简单的做一个定时服务
第一步:创建一个windows服务 第二步:通过NuGet 安装Quartz (我搜索了Quartz 关键字 安装了 ) 第三步 代码部分 任务类 如 多个任务 就多几个类 public class ...
- Quartz简单案例
需求需要开发一个每天定时推送消息给微信用户,第一次接触quartz,简单案例 1. 先编辑要执行的任务 测试类代码 package com.wqq.test.quartz; import org.sp ...
- Quartz和Spring Task定时任务的简单应用和比较
看了两个项目,一个用的是Quartz写的定时器,一个是使用spring的task写的,网上看了2篇文章,写的比较清楚,这里做一下留存 链接一.菠萝大象:http://www.blogjava.net/ ...
随机推荐
- PTA 错题记录
程设期中考, 记录一下曾经做错的选择填空. 1. 2. 3. 4. 5. 6.
- Sumdiv(约数和问题)
题目地址 看到这题的题解,大佬都说是小学奥数,蔡得我不敢鸡声. 求 \(a^b\) 所有的约数之和 mod \(9901\) \((1<=a,b<=5*10^7)\) 题解 做这道题,我还 ...
- 批量去除输出数据文件名前面的"\output\“
for file in \output\*; do mv "\(file" "\){file#\output\_}";done;
- [洛谷P3145] CQOI2009 循环赛
问题描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入格式 第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分. 输出格式 ...
- Task9.Attention
注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理.语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影.所以,了解注意力机制的工作原理对于关注深度学习技术发展的技 ...
- php array()函数 语法
php array()函数 语法 作用:生成一个数组 语法:索引数组:array(value1,value2,value3,etc.);关联数组:array(key=>value,key=> ...
- PHP中什么是数组
PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型. 此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集 ...
- Oracle DataGuard日志传输
1. 日志传输方式 有两种日志传输方式(ARC和LGWR),第一种是采用ARC进程传输日志,其示意图如下: 注:上图来自<大话Oracle RAC> 其大致过程如下: 1)主库:日志先写入 ...
- 432D Prefixes and Suffixes
题目大意 给你一个串 对于一个子串如果它既是前缀又是后缀 输出它的长度以及它在原串中一共出现了多少次 分析 对于既是前缀又是后缀的判断和126B相同 然后我们只需要记录每个不同的z[i]出现了多少次 ...
- Gradle查看Project中的所有 Task
查看Project中所有的Task:$ gradle tasks 查看Project中所有的properties:$ gradle properties 如: 参照了: https://www.jia ...