Quartz深入浅出(二)
来源:互联网 发布:管家公进销存软件 编辑:程序博客网 时间:2024/06/08 03:35
Hello Quartz / 本文通过一个简单的例子让大家快速了解Quartz,上手,并了解Quartz内的一些关键对象 如 Scheduler、Job、Trigger、JobExecutionContext等对象
- 导入Quartz所需的两个jar包 <quartz-2.2.1.jarr、quartz-jobs-2.2.1.jar>
- 创建我们自己的Job类 HelloJob,进行简单的输出
package org.quartz.examples.examples01;import java.util.Date;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;/** * hello world Quartz * @author weeks * */public class HelloJob implements Job { private static Logger _log = LoggerFactory.getLogger(HelloJob .class ); /** * Job,Job需要一个公有的构造函数,否则Factory无法构建 */ public HelloJob() { } /** * 实现execute方法 */ public void execute(JobExecutionContext context) throws JobExecutionException { _log.info( "Hello World! - " + new Date()); }}
- 创建我们的Job运行例子,在下一分钟执行我们自己Job
package org.quartz.examples.examples01;import static org.quartz.DateBuilder.evenMinuteDate ;import static org.quartz.JobBuilder.newJob ;import static org.quartz.TriggerBuilder.newTrigger ;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.Trigger;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Date;/** * 此Demo将演示如何启动和关闭Quartz调度器,以及如何运作 * @author weeks * */public class SimpleExample { public void run() throws Exception { Logger log = LoggerFactory.getLogger(SimpleExample.class); log.info("------- Initializing ----------------------"); // 1、工厂模式 构建Scheduler的Factory,其中STD为Quartz默认的Factory,开发者亦可自行实现自己的Factory;Job、Trigger等组件 SchedulerFactory sf = new StdSchedulerFactory(); // 2、通过SchedulerFactory获得Scheduler对象 Scheduler sched = sf.getScheduler(); log.info("------- Initialization Complete -----------"); // 3、org.quartz.DateBuilder.evenMinuteDate <下一分钟> -- 通过DateBuilder构建Date Date runTime = evenMinuteDate(new Date()); log.info("------- Scheduling Job -------------------"); // 4、org.quartz.JobBuilder.newJob --通过JobBuilder构建Job JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build(); // 5、通过TriggerBuilder进行构建 Trigger trigger = newTrigger().withIdentity("trigger1" , "group1").startAt(runTime ).build(); // 6、工厂模式,组装各个组件<JOB,Trigger> sched.scheduleJob(job, trigger); // [group1.job1] will run at: log.info(job.getKey() + " will run at: " + runTime); // 7、start sched.start(); log.info("------- Started Scheduler -----------------"); log.info("------- Waiting 65 seconds... -------------"); try { // wait 65 seconds to show job Thread.sleep(65L * 1000L); // executing... } catch (Exception e) { // } // shut down the scheduler log.info("------- Shutting Down ---------------------"); // 8、通过Scheduler销毁内置的Trigger和Job sched.shutdown(true); log.info("------- Shutdown Complete -----------------"); } public static void main(String[] args) throws Exception { SimpleExample example = new SimpleExample(); example.run(); }}
- 让我们来看看上面的代码究竟做了些什么:
- 创建一个Quartz Job类,必须实现 org.quartz.Job ,这个接口只有一个你要实现的方法,execute方法,其中execute的接口定义如下
- void execute(JobExecutionContext context) throws JobExecutionException;
- 当Quartz调度器到约定的时间,它就会生成一个Job的实例,所以你实现Job接口 必须提供一个公有函数,否则会抛出异常,并调用execute方法.其中调度器只管执行,而不关心结果,除非抛出JobExecutionException异常.
- JobExecutionContext 中封装有Quartz运行所需要的所有信息,可以参见下面具体的代码片段.
- 其中涉及到的Scheduler、Job、Trigger 3个关键对象 (后续会专门介绍这3个对象)
- 其中Scheduler调度器对象,它的方法有start()、shutdown()等方法,负责管理整个调度作业.
- Job 又与几个对象有关 Job、JobDetail、JobDataMap
- 通过类图来看他们之间的关系
- 通过类图可以很明显的看出由JobExecutionContext来组装各个子组件,我们看看JobExecutionContextImpl的源代码,它保存着所有上下文信息
private transient Scheduler scheduler ; private Trigger trigger; private JobDetail jobDetail; private JobDataMap jobDataMap; private transient Job job; private Calendar calendar; private boolean recovering = false; private int numRefires = 0; private Date fireTime; private Date scheduledFireTime; private Date prevFireTime; private Date nextFireTime; private long jobRunTime = -1; private Object result; private HashMap<Object, Object> data=new HashMap<Object, Object>();
- 关于JobDetail
- JobDetail不存储具体的实例,但它允许你定义一个实例,JobDetail 又指向JobDataMap
- JobDetail持有Job的详细信息,如它所属的组,名称等信息
- 关于JobDataMap
- JobDataMap保存着任务实例的对象,并保持着他们状态信息,它是Map接口的实现,即你可以往里面put和get一些你想存储和获取的信息.
- 关于Trigger
- 即根据具体约定的触发器,具体的如:SimpleTrigger、CronTrigger 等
- 创建一个Quartz Job类,必须实现 org.quartz.Job ,这个接口只有一个你要实现的方法,execute方法,其中execute的接口定义如下
11 1
- Quartz深入浅出(二)
- Quartz深入浅出(二)
- Quartz深入浅出(一)(二)
- Quartz深入浅出
- Quartz深入浅出
- Quartz深入浅出(一)
- Quartz深入浅出(一)
- Quartz深入浅出(一)
- Quartz(二) quartz测试
- quartz的使用(二)
- quartz初探(二)
- Quartz (二) Job任务
- quartz 学习二
- quartz使用(二)
- Quartz分布式任务(二)
- quartz集群(二)
- quartz(二):quartz和spring的整合
- 深入浅出flashcache(二)
- POJ-3190-贪心(优先队列)
- Begin1 - Unit5 - 队列的逆转 tyvj 以后我自己不会看
- linux定期删除tmp目录原理
- zoj 3537 Cake(三角划分dp+凸包)
- 結構體排序
- Quartz深入浅出(二)
- FFT源代码
- poj_1042_Gone Fishing
- java操作memcache简单例子
- pat1003
- 字符串分割类
- SPI速度最快,其次UART,IIC最慢。UART转成485通讯距离最长,其他两个应该差不多
- 有关C的学习笔记以及内存管理
- linux下搭建memcache