Quartz 是一个完全由 Java 编写的开源企业级作业调度框架。Quartz允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。
本文地址:http://blog.csdn.net/shanglianlm/article/details/71090476
Quartz的基础知识:
1) Job(调度器): 是一个接口,只定义一个方法execute(JobExecutionContext context),execute方法中定义所需要执行的任务。Job运行时的信息保存在JobDataMap实例中,调度应用信息保存在JobExecutionContext类中。
2) JobDetail(任务): JobDetail描述Job的实现类及其它相关信息,如Job名字、描述、关联监听器等,Quartz每次调度Job时接收一个Job实现类。
3)Trigger(触发器): 是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。
如果要求以固定时间间隔执行调度或者只调度一次时,选择SimpleTrigger,否则选择CronTrigger,CronTrigger可以使用Cron表达式配置出复杂的时间调度规则,CronTrigger表达式见Quartz Cron 表达式(二)。
4)Calendar:org.quartz.Calendar是一些日历特定时间点的集合, 一个Trigger可以和多个Calendar关联。
5) Scheduler: 代表一个Quartz的独立运行容器, Trigger和JobDetail可以注册到Scheduler中, 两者在Scheduler中拥有各自的组及名称, 组及名称是Scheduler查找定位容器中某一对象的依据, Trigger的组及名称必须唯一, JobDetail的组和名称也必须唯一。Scheduler定义了多个接口方法, 允许外部通过组及名称访问和控制容器中Trigger和JobDetail。
6) ThreadPool: Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。
示例代码:
QuartzJob.java
public class QuartzJob implements Job{
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("I am QuartzJob!");
}
}
QuartzDemo.java
public class QuartzDemo {
public static void main(String[] args) {
// 通过schedulerFactory获取一个调度器
SchedulerFactory schedulerfactory = new StdSchedulerFactory();
Scheduler scheduler = null;
try {
// 通过schedulerFactory获取一个调度器
scheduler = schedulerfactory.getScheduler();
// 创建jobDetail实例,绑定Job实现类
// 指明job的名称,所在组的名称,以及绑定job类
JobDetail job = JobBuilder.newJob(QuartzJob.class).withIdentity("JobName", "JobGroupName").build();
// 定义调度触发规则
// SimpleTrigger
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("SimpleTrigger","SimpleTriggerGroup")
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(3).withRepeatCount(6)).startNow().build();
// corn表达式 每五秒执行一次
//Trigger trigger = TriggerBuilder.newTrigger().withIdentity("CronTrigger1", "CronTriggerGroup")
// .withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ?")).startNow().build();
// 把作业和触发器注册到任务调度中
scheduler.scheduleJob(job, trigger);
// 启动调度
scheduler.start();
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 停止调度
scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}