Quartz是一个开源的做业调度框架,可让计划的程序任务一个预约义的日期和时间运行。Quartz能够用来建立简单或复杂的日程安排执行几十,几百,甚至是十万的做业数。
官方连接,戳这里html
Quartz 是一种功能丰富的,开放源码的做业调度库,能够在几乎任何Java应用程序集成 - 从最小的独立的应用程序到规模最大电子商务系统。Quartz能够用来建立简单或复杂的日程安排执行几十,几百,甚至是十万的做业数 - 做业被定义为标准的Java组件,能够执行几乎任何东西,能够编程让它们执行。 Quartz调度包括许多企业级功能,如JTA事务和集群支持。java
Quartz 是可自由使用,使用Apache 2.0 license受权方式。数据库
若是应用程序须要在给定时间执行任务,或者若是系统有连续维护做业,那么Quartz是理想的解决方案。编程
做业被安排在一个给定的触发时运行。触发器可使用如下指令的接近任何组合来建立:负载均衡
做业是由其建立者赋予的名字,也能够组织成命名组。触发器也能够给予名称和放置在组中,以方便地将它们调度内组织。做业能够被添加到所述调度器一次,而是具备多个触发器注册。在企业Java环境中,做业能够执行本身的工做做为分布式(XA)事务的一部分。框架
调度器。全部的调度都是由它控制。调度类连接“工做”和“触发器”到一块儿,并执行它。分布式
scheduler 实例化后,能够启动(start)、暂停(stand-by)、中止(shutdown)。注意:scheduler 被中止后,除非从新实例化,不然不能从新启动;只有当 scheduler 启动后,即便处于暂停状态也不行,trigger 才会被触发(job才会被执行)ide
Scheduler的生命期,从SchedulerFactory建立它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被建立后,能够增长、删除和列举Job和Trigger,以及执行其它与调度相关的操做(如暂停Trigger)。可是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job)函数
Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger);
Scheduler的主要函数:测试
注意关闭以后,scheduler不能重新开启,会抛出异常
Trigger用于触发Job的执行。当你准备调度一个job时,你建立一个Trigger的实例,而后设置调度相关的属性。Trigger也有一个相关联的JobDataMap,用于给Job传递一些触发相关的参数。Quartz自带了各类不一样类型的Trigger,最经常使用的主要是SimpleTrigger和CronTrigger。
SimpleTrigger – 每5秒运行
Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("dummyTriggerName", "group1") .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5).repeatForever()) .build();
CronTrigger – 每5秒运行。
Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("dummyTriggerName", "group1") .withSchedule( CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build();
JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中。
JobDetail对象是在将job加入scheduler时,由客户端程序(你的程序)建立的。它包含job的各类属性设置,以及用于存储job实例状态信息的JobDataMap。
1.下载 jar 包
能够从官方网站或 Maven 中央存储库下载 Quartz 库文件;
2.建立一个做业
HelloJob.java
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloJob implements Job{ @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { // TODO Auto-generated method stub System.out.println("Hello Quartz!"); } }
3.建立触发器,以及经过调度执行做业
SimpleTrigger.java
import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class SimpleTrigger { public static void main(String[] args) throws Exception { JobDetail job = JobBuilder.newJob(HelloJob.class) .withIdentity("dummyJobName", "group1").build(); // 定义一个Trigger Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("dummyTriggerName", "group1") // 定义 name/group .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5).repeatForever()) .build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } }
CronTrigger.java
import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class CronTrigger { public static void main(String[] args) throws Exception { JobDetail job = JobBuilder.newJob(HelloJob.class) .withIdentity("dummyJobName", "group").build(); Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("dummyJobName", "group") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } }
输出的结果以下:
每隔五分钟就会打印出一条 Hello Quartz!
Hello Quartz! Hello Quartz! Hello Quartz!
JobExecutionContext
JobDataMap
key
第一步:建立一个 Job。
在这个类中,咱们经过 JobExecutionContext
来获取 JobDataMap
、key
以及经过自定义传入的信息。代码中有备注,仔细看下就知道了。
HelloJob.java
import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.TriggerKey; public class HelloJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { // TODO Auto-generated method stub System.out.println("Hello Quartz!"); // 获取 JobDetail 的 key 和 group JobKey key = context.getJobDetail().getKey(); System.out.println("JobDetail key name: "+key.getName()); System.out.println("JobDetail key Group: "+key.getGroup()); // 从 JobExecutionContext 中获取一个实例, 获取从 jobDetail 传入的数据 JobDataMap dataMap = context.getJobDetail().getJobDataMap(); String JobMsg = dataMap.getString("message"); Float floatMsg = dataMap.getFloat("floatData"); System.out.println("JobDetial:"+ JobMsg); System.out.println("floatMsg:"+ floatMsg); //获取 trigger 的 key 和 group TriggerKey triggerKey = context.getTrigger().getKey(); System.out.println("TriggerKey key name: "+triggerKey.getName()); System.out.println("TriggerKey key Group: "+triggerKey.getGroup()); // 获取一个 trigger 的 jobDataMap 实例 JobDataMap triggerMap = context.getTrigger().getJobDataMap(); String triggerMsg = dataMap.getString("message"); System.out.println("triggerMsg:"+ triggerMsg); } }
第二步:测试类
import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class SimpleTrigger { public static void main(String[] args) throws Exception { JobDetail job = JobBuilder.newJob(HelloJob.class) .withIdentity("dummyJobName", "group1") .usingJobData("message", "hello myJob1") //传入自定义的数据 .usingJobData("floatData", 1.2F) .build(); // 定义一个Trigger Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("dummyTriggerName", "group1") // 定义 name/group .usingJobData("message", "hello myTrigger") .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5).repeatForever()) .build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } }
输出结果
Hello Quartz! JobDetail key name: dummyJobName JobDetail key Group: group1 JobDetial:hello myJob1 floatMsg:1.2 TriggerKey key name: dummyTriggerName TriggerKey key Group: group1 triggerMsg:hello myJob1