quartz2.2.1 example 01代码分析

package com.quartz.fsl.test.exaple1;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloJob implements Job {
private static Logger _log = LoggerFactory.getLogger(HelloJob.class);
public void execute(JobExecutionContext paramJobExecutionContext) throws JobExecutionException {
_log.info(this+"---HelloJob! - " + new Date());
}
}

-------------------------------------------------------

package com.quartz.fsl.test.exaple1;
import java.util.Date;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SimpleExample {
public void run() throws Exception {
Logger log = LoggerFactory.getLogger(SimpleExample.class);
log.info("1-SchedulerFactory的一个实现,它所有的工作创建QuartzScheduler实例基于属性文件的内容。");
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();

// 计算任务的开始时间,DateBuilder.evenMinuteDate方法是取下一个整数分钟
Date runTime = DateBuilder.evenMinuteDate(new Date());
log.info(runTime + "-----------DateBuilder.evenMinuteDate(new Date())");

log.info("2-真正执行的任务并不是Job接口的实例,而是用反射的方式实例化的一个JobDetail实例");
JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1",
"group1").build();

log.info("3-定义一个触发器,startAt方法定义了任务应当开始的时间及结束时间");

//SimpleTrigger默认启动一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1",
"group1").startAt(runTime).endAt(new Date(114, 5, 28)).build();

log.info("4-将任务和Trigger放入scheduler");
sched.scheduleJob(job, trigger);

log.info(job.getKey() + " will run at: " + runTime);
sched.start();

try {
log.info("5-等待65秒,保证下一个整数分钟出现,这里注意,如果主线程停止,任务是不会执行的");
Thread.sleep(126000L);
} catch (Exception e) {
}

log.info("6-Shutting Down ---------------------");
sched.shutdown(true);
}

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

-----------------------------------------------测试结果

[quartz1.6.6] INFO [main] com.quartz.fsl.test.exaple1.SimpleExample.run(25) | Fri Jun 27 11:31:00 CST 2014-----------DateBuilder.evenMinuteDate(new Date())
[quartz1.6.6] INFO [main] com.quartz.fsl.test.exaple1.SimpleExample.run(27) | 2-真正执行的任务并不是Job接口的实例,而是用反射的方式实例化的一个JobDetail实例
[quartz1.6.6] INFO [main] com.quartz.fsl.test.exaple1.SimpleExample.run(31) | 3-定义一个触发器,startAt方法定义了任务应当开始的时间及结束时间
[quartz1.6.6] INFO [main] com.quartz.fsl.test.exaple1.SimpleExample.run(35) | 4-将任务和Trigger放入scheduler
[quartz1.6.6] INFO [main] com.quartz.fsl.test.exaple1.SimpleExample.run(38) | group1.job1 will run at: Fri Jun 27 11:31:00 CST 2014
[quartz1.6.6] INFO [main] org.quartz.core.QuartzScheduler.start(575) | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
[quartz1.6.6] INFO [main] com.quartz.fsl.test.exaple1.SimpleExample.run(42) | 5-等待62秒,保证下一个整数分钟出现,这里注意,如果主线程停止,任务是不会执行的
[quartz1.6.6] INFO [DefaultQuartzScheduler_Worker-1] com.quartz.fsl.test.exaple1.HelloJob.execute(13) | com.quartz.fsl.test.exaple1.HelloJob@360be0---HelloJob! - Fri Jun 27 11:31:00 CST 2014
[quartz1.6.6] INFO [main] com.quartz.fsl.test.exaple1.SimpleExample.run(47) | 6-Shutting Down ---------------------
[quartz1.6.6] INFO [main] org.quartz.core.QuartzScheduler.shutdown(694) | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
[quartz1.6.6] INFO [main] org.quartz.core.QuartzScheduler.standby(613) | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
[quartz1.6.6] INFO [main] org.quartz.core.QuartzScheduler.shutdown(771) | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.


------------------------------------------------------

通过代码可以看到几个重要的类: 

  • JobDetail: 真正的任务内容,任务本身是集成Job接口的,但是真正的任务是JobBuilder通过反射的方式实例化的,
  • Trigger: 触发器,定义任务应当开始的时间,主要分为两类SimpleTrigger,CronTrigger,当前例子的就是简单触发器,CronTrigger主要用于处理quartz表达式定义的任务,比如每个月20号,每个星期一之类的。
  • Scheduler: 计划表(可能翻译的不太贴切),现在我们有了要做的内容,有了要做的时间,接下来,就把这两个内容填充到计划任务Scheduler对象里面,到了时间它就可以自动运行了。


理解了这三个重要类,其余的就比较好理解了,主要是提供服务的工具类或工厂类如 
DateBuilder:处理时间 
TriggerBuilder,JobBuilder。 

任务的完成是quartz为Scheduler分配的线程池启动的其他线程完成的,并不在主线程之中,具体的执行详细过程将在后续博客中撰写。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值