1.简介:
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.2.3。
2.使用场景:
网页游戏中挂机自动修炼如8个小时,人物相关数值进行成长,当使用某道具后,时间减少到4个小时,人物对应获得成长值.这其中就涉及到了Scheduler的操作,定时对人物进行更新属性操作,更改定时任务执行时间.
2).
企业中如每天凌晨2点触发数据同步、发送Email等操作
3.相关资料
官网:http://www.quartz-scheduler.org/
下载jar:http://www.quartz-scheduler.org/downloads
maven pom:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
4.架构的核心分析
1).SchedulerFactory -- 调度程序工厂
- StdSchedulerFactory -- Quartz默认的SchedulerFactory
- DirectSchedulerFactory -- DirectSchedulerFactory是对SchedulerFactory的直接实现,通过它可以直接构建Scheduler、threadpool 等
- ThreadExecutor / DefaultThreadExecutor -- 内部线程操作对象
- ThreadExecutor / DefaultThreadExecutor -- 内部线程操作对象
2).JobExecutionContext -- JOB上下文,保存着Trigger、 JobDeaitl 等信息,JOB的execute方法传递的参数就是对象的实例
- JobExecutionContextImpl
- StdScheduler -- Quartz默认的Scheduler
- RemoteScheduler -- 带有RMI功能的Scheduler
- JobDetail -- 他是实现轮询的一个的回调类,可将参数封装成JobDataMap对象,Quartz将任务的作业状态保存在JobDetail中.
- JobDataMap -- JobDataMap用来报错由JobDetail传递过来的任务实例对象
- SimpleTrigger <普通的Trigger> -- SimpleScheduleBuilder
- CronTrigger <带Cron Like 表达式的Trigger> -- CronScheduleBuilder
- CalendarIntervalTrigger <带日期触发的Trigger> -- CalendarIntervalScheduleBuilder
- DailyTimeIntervalTrigger <按天触发的Trigger> -- DailyTimeIntervalScheduleBuilder
- SimpleThreadPool --一个Quartz默认实现的简单线程池,它足够健壮,能够应对大部分常用场景
// 1、工厂模式 构建Scheduler的Factory,其中STD为Quartz默认的Factory
// 开发者亦可自行实现自己的Factory;Job、Trigger等组件
SchedulerFactory sf = new StdSchedulerFactory();
// 2、通过SchedulerFactory构建Scheduler对象
Scheduler sched = sf.getScheduler();
// 3、org.quartz.DateBuilder.evenMinuteDate -- 通过DateBuilder构建Date
Date runTime = evenMinuteDate( new Date());
// 4、org.quartz.JobBuilder.newJob <下一分钟> --通过JobBuilder构建Job
JobDetail job = newJob(HelloJob.class).withIdentity("job1","group1").build();
// 5、通过TriggerBuilder进行构建Trigger
Trigger trigger = newTrigger().withIdentity("trigger1","group1")
.startAt(runTime).build();
// 6、工厂模式,组装各个组件<JOB,Trigger>
sched.scheduleJob (job, trigger);
// 7、start
sched.start();
try {
Thread.sleep(65L * 1000L);
} catch (Exception e) {
}
// 8、通过Scheduler销毁内置的Trigger和Job
sched.shutdown(true);
6.总结