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/ ...
随机推荐
- Linux手册页内容
总用9页 man1:可执行程序或shell命令 man2:系统调用(kernel提供的函数) man3:库调用(程序库中的函数) man4:/dev中的特殊文件 ...
- LinuxC语言实现服务端与客户端多进程通信
链接:https://pan.baidu.com/s/1YDNIyTKAkh4E5x2dBeTgcQ 提取码:y35q 复制这段内容后打开百度网盘手机App,操作更方便哦 本实验用的是Centos7m ...
- [NOI2007]社交网络(最短路)
[NOI2007]社交网络 Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之 ...
- Pycharn破解补丁激活
Pycharn破解补丁激活 到期时间: 1. 下载 https://pan.baidu.com/s/1mcQM8CLUnweY02ahKEr4PQ 并将 JetbrainsCrack-release ...
- vue服务器端渲染指南研究
什么是服务器端渲染(SSR)? Vue.js 是构建客户端应用程序的框架.默认情况下,可以在浏览器中输出 Vue 组件,进行生成 DOM 和操作 DOM.然而,也可以将同一个组件渲染为服务器端的 HT ...
- 玩转MaxCompute studio SQL编辑器
SQL因其简单易学的特点,是用户与MaxCompute服务交互的主要手段.如何帮助用户高效愉快的编写SQL是MaxCompute studio的核心使命,下面就让我们来一探究竟: 忘记语法 相信大家都 ...
- 【转】Django 模板语法
转自:https://www.cnblogs.com/love9527/p/9077863.html Django 模板语法 一.模板 只要是在html里面有模板语法就不是html文件了,这样的文件就 ...
- 2019 上海网络赛 J stone name (01背包)
题目:https://nanti.jisuanke.com/t/41420 题意:给你一个集合,然后让你拆成两个集合 x,y 求满足 x>y && x-(x集合中最小 ...
- 如何创建自定义的Resource实例
由Resource的构造函数Resources(AssetManager assets, DisplayMetrics metrics, Configuration config)了解到,需要获取ap ...
- php的URL查询字符串解析函数
URL查询字符串格式:Data[650][BLN]=40002307312&Data[650][Status]=電聯無人接聽. 解析这种数据使用函数:parse_str(). parse_st ...