Quartz定时框架入门
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定时框架入门的更多相关文章
- 基于spring的quartz定时框架,实现简单的定时任务功能
在项目中,经常会用到定时任务,这就需要使用quartz框架去进行操作. 今天就把我最近做的个人主页项目里面的定时刷新功能分享一下,很简单. 首先需要配置一个配置文件,因为我是基于spring框架的,所 ...
- 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出
1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法 Shiro框架内部整合好缓存管理器, ...
- Quartz定时调度框架
Quartz定时调度框架CronTrigger时间配置格式说明 CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年 ...
- Quartz .Net(定时框架):
Quartz .Net(定时框架): 基本说明: 说明:Quartz .Net 是一个从 Java 版的 Quartz 移植过来定时任务框架,可以实现异常灵活的定 时任务 用法: 安装 Quartz ...
- Quartz应用实践入门案例二(基于java工程)
在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...
- 第一节: Timer的定时任务的复习、Quartz.Net的入门使用、Aop思想的体现
一. 前奏-Timer类实现定时任务 在没有引入第三方开源的定时调度框架之前,我们处理一些简单的定时任务同时都是使用Timer类, DotNet中的Timer类有三个,分别位于不同的命名空间下,分别是 ...
- GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台
注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...
- Quartz应用实践入门案例一(基于Web环境)
Quartz是一个完全由java编写的开源作业调度框架,正是因为这个框架整合了许多额外的功能,所以在使用上就显得相当容易.只是需要简单的配置一下就能轻松的使用任务调度了.在Quartz中,真正执行的j ...
- Quartz任务调度快速入门
Quartz任务调度快速入门 概述 了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的 ...
随机推荐
- python算法:LinkedList(双向线性链表)的实现
LinkedList是一个双向线性链表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一 ...
- 深入解析当下大热的前后端分离组件django-rest_framework系列一
前言 Nodejs的逐渐成熟和日趋稳定,使得越来越多的公司开始尝试使用Nodejs来练一下手,尝一尝鲜.在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线.将浏览器中为用户进行页面展 ...
- libev 学习使用
libev 简单的I/O库. a high performance full featured event loop written in c libev 的大小也比 libevent 小得多并且自 ...
- hdu 1534(差分约束)
Schedule Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)
本篇文章是使用python抓取数据的第一篇,使用requests+BeautifulSoup的方法对页面进行抓取和数据提取.通过使用requests库对链家网二手房列表页进行抓取,通过Beautifu ...
- head first (二):观察者模式
首先推荐一下别人写的,很不错可以参考,http://www.cnblogs.com/li-peng/archive/2013/02/04/2892116.html 1.定义 观察者模式:在对象之间定义 ...
- PHP的Trait
PHP的Trait Trait是在PHP5.4中加入的,它既不是接口也不是类.主要是为了解决单继承语言的限制.是PHP多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这 ...
- python提纲
根据网上专栏整理提纲 1.模块介绍 2.time&datetime模块 3.random模块 4.os模块 5.sys模块 6.json&pickle模块 7.logging模块 8. ...
- ng2-admin安装问题
问题一 启动项目出现如下error: 原理: 暂不清晰, 目前认为是项目本身的问题. 项目作者在博文中给出了相应的解决方案. 具体解决方案: 如果之前装过angular-cli需要先卸载:npm un ...
- JS动态计算移动端rem的解决方案
首先介绍下rem 说起rem就的说px,em: PX为单位 在Web页面初期制作中,我们都是使用“px”来设置我们的文本,因为他比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的 ...