Quartz框架是Java开源的定时任务调度器,Quartz框架中有如下核心概念:

1. Job

  任务接口,接口中只声明方法void execute(JobExecutionContext context),接口的声明如下:

public interface Job {

    void execute(JobExecutionContext context) throws JobExecutionException;

}

  

2.   JobDetail

  Quartz执行Job时,需要重新创建新Job实例,所以Quartz不可直接接受Job的实例,相反它接收一个Job实现类以便运行时通过Java反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,   JobDetail封装了这些信息。

3.   Trigger

  Quartz框架任务执行的触发器,在Quartz框架中提供了四类任务触发器:SimpleTrigger、CronTrigger、DailyTimeIntervalTrigger、CalendarIntervalTrigger

在Qunar框架中,JobDetail的对象是通过JobBuilder构建,Trigger对象时通过TriggerBuilder构建,下面演示一个简单的示例:

public class SchedulerDemo {

    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    private static SchedulerFactory schedulerFactory ;

    static {
try {
Properties props = new Properties();
props.load(SchedulerDemo.class.getResourceAsStream("quartz.properties"));
schedulerFactory = new StdSchedulerFactory(props);
} catch (Exception e) {
System.out.println("[StdSchedulerFactory] init error");
}
} public static class HelloQuartzJob implements Job { @Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello Quartz! - executing its Job at [" + SDF.format(new Date()) + "] by ["
                                                          + context.getTrigger().getDescription() + "]");
} } /**
* JobDetail的构造通过JobBuilder构建,JobBuilder在内部调用JobDetail的实现类JobDetailImpl
* */
public void run(Trigger trigger) throws SchedulerException {
Scheduler scheduler = schedulerFactory.getScheduler();
JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJob.class)
.withIdentity("helloQuartz", "demo")
.build();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} /**
* Trigger的构造通过TriggerBuilder创建
* */
public Trigger getSimpleTrigger() {
SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity("simpleTrigger", "demo")
.withDescription("SimpleTrigger")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.withRepeatCount(5))
.build();
return simpleTrigger; } /**
* CornExpress允许的字符
* 秒 0-59 , - * /
* 分 0-59 , - * /
* 小时 0-23 , - * /
* 日期 1-31 , - * ? / L W C
* 月份 1-12 或者 JAN-DEC , - * /
* 星期 1-7或者 SUN-SAT , - * ? / L C #
* 年(可选) 留空, 1970-2099 , - * /
* 特殊字符 意义
* * 表示所有值
* ? 表示未说明的值,即不关心它为何值
* - 表示一个指定的范围
* , 表示附加一个可能值
* / 符号前表示开始时间,符号后表示每次递增的值;
* 举例:
* "0 0 12 * * ?" 每天中午12点触发
* "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
* "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
* */
public Trigger getCronTrigger() {
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("cronTrigger", "demo")
.withDescription("CronTrigger")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("0 17 17 * * ? *"))
.build();
return trigger;
} public Trigger getDailyTimeIntervalTrigger() {
DailyTimeIntervalTrigger trigger = (DailyTimeIntervalTrigger) TriggerBuilder.newTrigger()
.withIdentity("dailyTimeIntervalTrigger", "demo")
.withDescription("dailyTimeIntervalTrigger")
.startNow()
.withSchedule(DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule()
.onEveryDay()
.startingDailyAt(new TimeOfDay(17,32,10))
.withInterval(10, IntervalUnit.SECOND)
.withRepeatCount(1))
.build();
return trigger;
} public Trigger getCalendarIntervalTrigger() {
CalendarIntervalTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("CalendarIntervalTrigger", "demo")
.withDescription("CalendarIntervalTrigger")
.startNow()
.withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule()
.withInterval(10,IntervalUnit.SECOND))
.build();
return trigger;
} public static void main(String []args) throws SchedulerException {
SchedulerDemo schedulerDemo = new SchedulerDemo();
// schedulerDemo.run(schedulerDemo.getSimpleTrigger());
// schedulerDemo.run(schedulerDemo.getCronTrigger());
// schedulerDemo.run(schedulerDemo.getDailyTimeIntervalTrigger());
schedulerDemo.run(schedulerDemo.getCalendarIntervalTrigger());
} }

  

Quartz定时框架入门的更多相关文章

  1. 基于spring的quartz定时框架,实现简单的定时任务功能

    在项目中,经常会用到定时任务,这就需要使用quartz框架去进行操作. 今天就把我最近做的个人主页项目里面的定时刷新功能分享一下,很简单. 首先需要配置一个配置文件,因为我是基于spring框架的,所 ...

  2. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...

  3. Quartz定时调度框架

    Quartz定时调度框架CronTrigger时间配置格式说明 CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年 ...

  4. Quartz .Net(定时框架):

    Quartz .Net(定时框架): 基本说明: 说明:Quartz .Net 是一个从 Java 版的 Quartz 移植过来定时任务框架,可以实现异常灵活的定 时任务 用法: 安装 Quartz ...

  5. Quartz应用实践入门案例二(基于java工程)

    在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...

  6. 第一节: Timer的定时任务的复习、Quartz.Net的入门使用、Aop思想的体现

    一. 前奏-Timer类实现定时任务 在没有引入第三方开源的定时调度框架之前,我们处理一些简单的定时任务同时都是使用Timer类, DotNet中的Timer类有三个,分别位于不同的命名空间下,分别是 ...

  7. GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台

    注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...

  8. Quartz应用实践入门案例一(基于Web环境)

    Quartz是一个完全由java编写的开源作业调度框架,正是因为这个框架整合了许多额外的功能,所以在使用上就显得相当容易.只是需要简单的配置一下就能轻松的使用任务调度了.在Quartz中,真正执行的j ...

  9. Quartz任务调度快速入门

    Quartz任务调度快速入门 概述 了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的 ...

随机推荐

  1. 关于oracle的连接时ORA-12519错误的解决方案

    系统在运行时出现了ORA-12519的错误,无法连接数据库,后来在网上找了下,找到了如下的解决方法,共享下. OERR: ORA-12519 TNS:no appropriate service ha ...

  2. __rb_tree_rebalance

    Inline void __rb_tree_rebalance(__rb_tree_node_base* x, __rb_tree_node_base*& root) //当前节点,根 { x ...

  3. linux用grep查找包含两个关键字的命令

    linux用grep查找包含两个关键字的命令 http://zhidao.baidu.com/link?url=VsFxeJXmU7W7hy1UH7eT6QAbUsVz9Ru2ABPuWYHWm4kB ...

  4. PHP魔术方法使用

    PHP魔术方法的使用 PHP魔术方法的使用 1.__get()   和  __set(); 2.__call()   和  __callStatic();   3.__toString(); 4.__ ...

  5. 【cocos2d-js官方文档】十七、事件分发机制

    简介http://blog.csdn.net/qinning199/article/details/41951517 游戏开发中一个很重要的功能就是交互,如果没有与用户的交互,那么游戏将变成动画,而处 ...

  6. php中parse_url函数的源码及分析(scheme部分)

    前言 看师傅们的文章时发现,parse_url出现的次数较多,单纯parse_url解析漏洞的考题也有很多,在此研究一下源码(太菜了看不懂,待日后再补充Orz) 源码 在ext/standard/ur ...

  7. ZCMU Problem H: Crixalis's Equipment(贪心,排序)

    #include<stdio.h> #include<stdlib.h> struct node { int a,b; }c[1002]; int cmpxy(const st ...

  8. Dfs【bzoj3252】攻略

    Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景(s ...

  9. [ARC100]E:Or Plus Max(FZT)

    https://arc100.contest.atcoder.jp/tasks/arc100_c 一个很自然的想法是,对于每个K求出i or j=k的所有a[i]+a[j]的最大值ans[k],答案就 ...

  10. 前端基础-HTML标记语言

    阅读目录 一. HTML标签与文档结构 二. HTML标签详细语法与注意点 三. HTML中标签分类 四. HTML注释 一. HTML标签与文档结构 HTML作为一门标记语言,是通过各种各样的标签来 ...