Quartz学习笔记(一)

因为下个项目需要用到定时器,以前写定时器用的是 Timer类,都是一些比较简单的 Task ,这次的后台 Task 比较多,并且业务也相对复杂,所有再看需求 的同时,自己了看了下Quartz,先将学习笔记总结如下:

1、Quartz 简介
a、Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。
b、主页:http://www.quartz-scheduler.org/
c、目前最近版本:Quartz 1.8.0 Released - 04/22/2010

2、笔记记录:
a、构建一个简单的 Quartz 程序
MySimpleExample.java

package com.sc.quartz.myexamples;

import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;

public class MySimpleExample {

public void run() throws SchedulerException{
// 创建调度者工厂
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 用工厂创建一个调度者
Scheduler scheduler = schedulerFactory.getScheduler();
// 利用 Quartz 提供的 getNextGivenSecondDate 返回一个当前时间四舍五入的 5 的倍数时间
long ts = TriggerUtils.getNextGivenSecondDate(null, 5).getTime();
// 创建一个工作,并命名为‘job1’,放入‘group1’组中,HellowWorl 是在此工作中需要执行的类
JobDetail jobDetail = new JobDetail("job1","group1",HelloWorld.class);
// 创建一个触发器,并命名为‘trigger1’,将此触发器设置在 ‘job1’ 上 ,并设置什么情况下启动
SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1","job1", new Date(ts), null, -1, 1000L);
// 将 ‘job1’ 加入调度者中,
scheduler.scheduleJob(jobDetail, simpleTrigger);
// 开始运行调度程序
scheduler.start();
// 停止调度程序
// scheduler.shutdown(true);
}

public static void main(String[] args) throws SchedulerException {
MySimpleExample example = new MySimpleExample();
example.run();
}
}


HellowWorld.java

package com.sc.quartz.myexamples;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloWorld implements Job {

public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("Hello World...");
}

}


这里说下HellowWord类,此类实现了 Job 接口,重写了 Job 接口中的 execute 方法,当调度程序开始运行后,系统会自动调用 HelloWorld 的 execute 方法,也就相当于 TimerTask类中的 run 方法。

b、Quartz 支持同时运行多个 Job,他会根据 quartz.properties 初始化相应的线程

c、Quartz 支持两种触发器,分别是:SimpleTrigger 和 CronTrigger,SimpleTrigger 适合一些简单的设置,例如:从什么时候开始,到什么时候,每间隔多少时间执行一次,一共执行多少次;如果你要实现一些比较复杂定时功能,就必须用 CronTrigger 类,他支持 Unix 的语言(Unix我也不熟)“0/20 * * * * ?”。

// 表达式:从当前开始,没20秒执行一次,‘秒’
CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1",
"group1", "0/20 * * * * ?");


d、Quartz 中参数的设置
Quartz 中的 JobDataMap 类,提供参数的存储,此类相当于 HaspMap 类,以键/值的方式存储数据,可以通过 JobExecutionContext 上下问类来获取 JobDataMap 的实例。

// 获取上下文,并取出‘FAVORITE_COLOR’键对应的值
JobDataMap data = context.getJobDetail().getJobDataMap();
String favoriteColor = data.getString(FAVORITE_COLOR);
// 为 ‘FAVORITE_COLOR’重新赋值
data.put(EXECUTION_COUNT, count);



e、Quartz 可以设置打火策略

trigger.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT);


f、Quartz 可以设置运行失败后就行的操作

// 报错后立即重新运行
e2.setRefireImmediately(true);

// 报错后停止运行
e2.setUnscheduleAllTriggers(true);


g、Quartz 跳过特殊日期
Quartz 支持在规定好的时间内将写特定时间跳过

// Add the holiday calendar to the schedule
// 创建假期日期
AnnualCalendar holidays = new AnnualCalendar();

// halloween (Oct 31)
Calendar halloween = new GregorianCalendar(2005, 9, 31);
// 设置跳过这一天
holidays.setDayExcluded(halloween, true);

// 将此 holidays 告知调度者
sched.addCalendar("holidays", holidays, false, false);


h、Quartz 监听器
Quartz 支持监听器功能,目前可以监听三种状态:jobExecutionVetoed(Job执行被拒接)、jobToBeExecuted(job执行之前)、jobWasExecuted(job)执行之后。如果你想监听这些状态并想作出行为的话,需要实现 Quartz 提供的 JobListener 接口,并实现相应的方法,在其中写你要执行的程序

i、Quartz 支持插件功能
Quartz 可以通过读取xml来设置相应的参数,这样你就可以通过修改xml来修改相应的参数

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz_data.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 120
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false


j、其他
Quartz 支持读取远程DB、支持优先级的设置、服务器集群等等等等。

3、总结
Quartz 支持的功能很多,用起来比较灵活,修改配置也很方便,并且 spring 对其也有支持,提供把 Quartz 整合在项目中。因为时间比较仓促,抽出了两天的时候才看 Quartz,所以了解的还是比较简单的,如果有什么问题或者错误还希望大家指出来,以便共同探讨,及时修改。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值