一、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. openprocess打不开 如何读取exe路径描述

    openprocess打不开 如何读取exe路径描述 openprocess打不开 如何读取exe路径描述 https://bbs.pediy.com/thread-210652.htm https: ...

  2. Java使用多线程发送消息

    在后台管理用户信息的时候,经常会用到批量发送提醒消息,首先想到的有: (1).循环发送列表,逐条发送.优点是:简单,如果发送列表很少,而且没有什么耗时的操作,是比较好的一种选择,缺点是:针对大批量的发 ...

  3. Kconfig的简单例子

    https://cloud.tencent.com/developer/article/1431908 使用Kconfig时,需要注意的地方 1.在Kconfig中定义的配置宏,前缀都没有" ...

  4. 《Webkit技术内幕》之页面渲染过程

    文章同步到github<Webkit技术内幕>之页面渲染过程 最近拜读了传说中的<Webkit技术内幕>一书,有很大收获,尤其是对页面渲染有了较深的认识.由于功力有限,而且书中 ...

  5. count(*),count(1),count(列名)的区别

    count(*)和count(1)无任何差别,永远优于count其他字段只要存在普通索引,count就会使用普通索引,只存在主键时,count(*)和或count(1)会使用主键索引 count(a) ...

  6. Java中的栈和队列

    栈: public class Stack<E> extends Vector<E> { // 使用数组实现栈 // 构造一个空栈 public Stack() { } // ...

  7. NIO编程模式示例

    1. 服务端 import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.*; im ...

  8. 方法返回前面有if - else if - else ,最终返回值是?

    -(NSString *)testA{ int a = ?; ) { return @"a大于5"; } ) { return @"a不大于5"; } retu ...

  9. ng mvc + @Valid + @RequestBody 接收json同时校验javaBean的数据有效性

    @Valid @RequestBody CustomerDto customerBean @RequestMapping(value="/customerDataSync.do", ...

  10. 向量积&&凸包算法

    参考:Thanks 百度百科 http://blog.csdn.net/keng_s/article/details/52131034 https://www.cnblogs.com/aiguona/ ...