Quartz是一个彻底由java编写的任务调度框架。
那么什么是任务调度呢?不少时候你可能会收到某个需求,要求程序 “ 隔某个特定的时间段 在某个特定的时间 作某个特定的事情 ”,好比:java
这些都是任务调度。而Quartz就是能够方便你建立各类任务定时执行的一个框架,并且触发这些任务的时间点能够设计的很是复杂,几乎都能完美匹配你的要求。web
使用Quartz开发,首先,你要写一个实现org.quartz.Job的类,重写org.quartz.Job接口惟一的方法execute(),在这个方法里面写你要定时执行的代码。服务器
public class TestJob implements Job{ public void execute(JobExecutionContext arg0) throws JobExecutionException { Date date=new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.print("now:"+sf.format(date)); } }
而后,建立一个执行任务的类,建立scheduler,这能够理解为一个调度程序-任务执行计划表,在这个表里面对各个job任务进行时间分配。框架
SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler schedule = sfact.getScheduler();
而后,建立JobDetail的实例,指定执行哪一个job。分布式
JobDetail jobDetail1 = JobBuilder.newJob((Class<? extends Job>) TestJob.class) //定义Job类为TestJob类 .withIdentity("myjob1", "group1") //定义name、group .build();
而后,建立一个CronTrigger实例,指定执行时间。ui
CronTrigger trigger1 =(CronTrigger) TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0 0 10 ? * MON")) //每週一早上十點執行 .build();
最后,将哪一个job由哪一个trigger触发安排设置进调度程序-任务执行计划表,并启动它。.net
schedule.scheduleJob(jobDetail1, trigger1); schedule.start();
至此,一个定时任务就写出来了,真的很简单。
完整代码以下:设计
public class QuartzLoad { private static Scheduler sched; public static void run() throws Exception { //一個job能够對應多個tigger,可是一個trigger不能對應多個job。 System.out.println("啟動定時任務"); //建立Scheduler SchedulerFactory sfact = new StdSchedulerFactory(); sched = sfact.getScheduler(); //每週一早上8點执行任务 JobDetail jobDetail1 = JobBuilder.newJob((Class<? extends Job>) TestJob.class) .withIdentity("myjob1", "group1").build(); CronTrigger trigger1 =(CronTrigger) TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0 0 8 ? * MON")) .build(); schedule.scheduleJob(jobDetail1, trigger1); schedule.start(); } //中止 public static void stop() throws Exception{ sched.shutdown(); } }
能够先用main方法启动试试,若是是web项目能够用监听器启动。例:code
/** * 監聽器 * */ public class TimingTaskSchedule implements ServletContextListener{ // 服务器启动时执行该事件 public void contextInitialized(ServletContextEvent arg0) { try { QuartzLoad.run(); } catch (Exception e) { e.printStackTrace(); } } // 服务器中止时执行该事件 public void contextDestroyed(ServletContextEvent arg0) { try { QuartzLoad.stop(); } catch (Exception e) { e.printStackTrace(); } } }
Quartz提供了多种触发器,比较经常使用的有 CronTrigger和SimpleTrigger ,建立触发器时的时间表达式怎么写?见这篇博客:点击连接orm