一、Quartz 介绍

Quartz是Java领域最著名的、功能丰富的、开放源码的作业调度工具,几乎可以在所有的Java应用程序中集成——从小的单机应用到大的电子商务系统。 Quartz可以用来执行成百上千甚至数万的级别的、简单或者复杂的作业调度,一个Job可以执行任意的你所编程的任务。 Quartz调度包括许多企业级功能,如JTA事务和集群支持。

Quartz的主要角色有:

  1. Job:被调度的任务,重写其中execute方法,每次调度时会执行该方法;
  2. JobDetail:一个Job的具体化,可以这么看,JobDetail = Job + JobData
  3. Scheduler:调度器
  4. SchedulerFactory:调度工厂
  5. 各种ScheduleBuilder:CronScheduleBuilder(支持cron表达式的调度器)、CalendarIntervalScheduleBuilder(支持时间间隔的调度器)、SimpleScheduleBuilder(最简单的触发器,可以设置间隔,重复次数)
  6. 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的简单使用的更多相关文章

  1. 基于Quartz实现简单的定时发送邮件

    一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...

  2. Quartz定时任务简单实例

    文章纲要: 初步搭建一个由Quartz为引擎集群的定时任务模块,功能为每隔30秒打印一条信息(Hello World!!!) 一.环境 Spring MVC Mevan Quartz 2.2.1 二. ...

  3. C#中Quartz的简单易懂定时任务实现

    作为一个优秀的开源调度框架,Quartz 具有以下特点: 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求: 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种 ...

  4. Quartz SpringBoot 简单整合一下

    一次简单的代码整合记录. 数据库准备 如果是MySQL可能出现一些小问题.比如联合主键长度超限制,已经记录解决办法了. CREATE TABLE QRTZ_JOB_DETAILS ( SCHED_NA ...

  5. Quartz.Net简单使用

    Quartz.Net为开源的作业调度框架,使用方便,实现IJob接口,及相关配置,即可实现调度. 项目包安装: install-package Quartz install-package log4n ...

  6. quartz 的简单使用

    0.依赖: <!-- 引入quartz对应的依赖 --> <dependency> <groupId>org.quartz-scheduler</groupI ...

  7. 使用Quartz Job 简单的做一个定时服务

    第一步:创建一个windows服务 第二步:通过NuGet 安装Quartz (我搜索了Quartz 关键字 安装了 ) 第三步 代码部分 任务类 如 多个任务 就多几个类 public class ...

  8. Quartz简单案例

    需求需要开发一个每天定时推送消息给微信用户,第一次接触quartz,简单案例 1. 先编辑要执行的任务 测试类代码 package com.wqq.test.quartz; import org.sp ...

  9. Quartz和Spring Task定时任务的简单应用和比较

    看了两个项目,一个用的是Quartz写的定时器,一个是使用spring的task写的,网上看了2篇文章,写的比较清楚,这里做一下留存 链接一.菠萝大象:http://www.blogjava.net/ ...

随机推荐

  1. qt 视频播放

    可以播出视频,待完善 player = new QMediaPlayer(this); playlist = new QMediaPlaylist(); playlist->addMedia(Q ...

  2. 【Database】Mysql分布式集群学习笔记

    一.sql 的基本操作 (2018年11月29日,笔记) (1)数据库相关操作 创建数据库.查看数据库.删除数据库 #. 创建数据库 create database mytest default ch ...

  3. alert(1) to win 8

    function escape(s) { return '<script>console.log("' + s.toUpperCase() + '")</scri ...

  4. LOJ 2840「JOISC 2018 Day 4」糖

    有趣的脑子题(可惜我没有脑子 好像也可以称为模拟费用流(? 我们考虑用链表维护这个东西 再把贡献扔到堆里贪心就好了 大概就是类似于有反悔机制的贪心?我们相当于把选中的一个打上一个-v的tag然后如果选 ...

  5. LeetCode--039--组合总和(java)

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  6. re正则常用示例积累

    2019-12-7 import re ''' 示例1: 提取网站的网址 ''' urls = ['https://blog.csdn.net/xxcupid/article/details/5199 ...

  7. 算法-python

    选择排序:一个列表被分为无序列表和有序列表,选择排序就是拿无序列表的第一个和后面的每一个相比较,每一趟选择出最小的一个,添加进有序列表. def select_sort(list): for i in ...

  8. Influxdb根据配置文件启动(Influxdb的数据存储)

    1.在Influxdb文件夹下建立一个bat文件 2.文件内容如下: @echo offSETLOCAL :: 获取当前批处理所在路径SET InfluxdP==%~dp0 :: 开启influxdb ...

  9. 简单的DOS攻击之死亡之ping详解

    DOS攻击之死亡之ping详解,dos攻击,俗称拒绝服务攻击,通过发送大量的无用请求数据包给服务器,耗尽服务器资源,从而无法通过正常的访问服务器资源,导致服务器崩溃. 如果多个ip通过发起对一个服务器 ...

  10. 实现粘贴WORD图片的在线编辑器

    我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...