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/ ...
随机推荐
- qt 视频播放
可以播出视频,待完善 player = new QMediaPlayer(this); playlist = new QMediaPlaylist(); playlist->addMedia(Q ...
- 【Database】Mysql分布式集群学习笔记
一.sql 的基本操作 (2018年11月29日,笔记) (1)数据库相关操作 创建数据库.查看数据库.删除数据库 #. 创建数据库 create database mytest default ch ...
- alert(1) to win 8
function escape(s) { return '<script>console.log("' + s.toUpperCase() + '")</scri ...
- LOJ 2840「JOISC 2018 Day 4」糖
有趣的脑子题(可惜我没有脑子 好像也可以称为模拟费用流(? 我们考虑用链表维护这个东西 再把贡献扔到堆里贪心就好了 大概就是类似于有反悔机制的贪心?我们相当于把选中的一个打上一个-v的tag然后如果选 ...
- LeetCode--039--组合总和(java)
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- re正则常用示例积累
2019-12-7 import re ''' 示例1: 提取网站的网址 ''' urls = ['https://blog.csdn.net/xxcupid/article/details/5199 ...
- 算法-python
选择排序:一个列表被分为无序列表和有序列表,选择排序就是拿无序列表的第一个和后面的每一个相比较,每一趟选择出最小的一个,添加进有序列表. def select_sort(list): for i in ...
- Influxdb根据配置文件启动(Influxdb的数据存储)
1.在Influxdb文件夹下建立一个bat文件 2.文件内容如下: @echo offSETLOCAL :: 获取当前批处理所在路径SET InfluxdP==%~dp0 :: 开启influxdb ...
- 简单的DOS攻击之死亡之ping详解
DOS攻击之死亡之ping详解,dos攻击,俗称拒绝服务攻击,通过发送大量的无用请求数据包给服务器,耗尽服务器资源,从而无法通过正常的访问服务器资源,导致服务器崩溃. 如果多个ip通过发起对一个服务器 ...
- 实现粘贴WORD图片的在线编辑器
我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...