quartz是一种开源任务调度框架,提供了强大的任务调度机制,Quartz允许开发人员灵活地定义触发器的调度时间表,并可对触发器和任务进行关联映射。废话不多说了,介绍一下编程的基本步骤:
- 实现Job接口,编码实现需要执行的任务。
- 定义jobdetail对象,这个对象需要job实现类作为参数
- 定义trigger,trigger就是一个时间表,定义什么时候来执行任务,主要分为simpletrigger和crontrigger两个子类,前者适用于简单情况:只执行一次或者固定间隔执行;后者使用表达式来灵活调度任务的执行。
- 定义schedulefactory实例,从schedulefactory工厂中获取schedule对象。schedule就像一个容器,里面放入任务和时间表,将某个任务和某个时间表绑定,就可以让任务按照指定的时间执行。其实schedule就是一个线程池。
下面是个例子:
package quartz; import java.util.Date; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Copyright * <br/>Program Name:TestJavaProject * <br/>Comments: * <br/>JDK version used: * <br/>Create Date:2013-7-17 * @author LA * @version */ public class SimpleJob implements Job{ private Logger logger=LoggerFactory.getLogger(SimpleJob.class); @Override public void execute(JobExecutionContext jobCtx) throws JobExecutionException { System.out.println("I can count to 10->"); //输出1-10 for(int i=1;i<=10;i++){ System.out.println(" | "+i+" "); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO: handle exception } } System.out.println("<-See I did it."); JobDataMap properties=jobCtx.getJobDetail().getJobDataMap(); System.out.println("Previous fire time: "+jobCtx.getPreviousFireTime()); System.out.println("curent file time: "+jobCtx.getFireTime()); System.out.println("next fire time: "+jobCtx.getNextFireTime()); } }
package quartz; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; /** * Copyright * <br/>Program Name:TestJavaProject * <br/>Comments: * <br/>JDK version used: * <br/>Create Date:2013-7-17 * @author LA * @version */ public class CronTriggerRunner { /** * @param args */ public static void main(String[] args) { try { JobDetail jobDetail=JobBuilder.newJob(SimpleJob.class).withIdentity("myjob", "job-group").build(); CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity("cronTrigger", "trigger-group").withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build(); SchedulerFactory sFactory=new StdSchedulerFactory(); Scheduler scheduler=sFactory.getScheduler(); scheduler.scheduleJob(jobDetail, cronTrigger); scheduler.start(); } catch (Exception e) { e.printStackTrace(); } } }
其中定义crontrigger对象时,使用“0/5 * * * * ?”来表示执行的时间表,意思是从0s开始,每隔5秒执行一次,每分每时每天每月。其中0/5的意思是:从0开始,每隔5,即0,5,10.。。。;“*”表示通配,“?”表示占位,没有意义。更多的表达式写法可以查阅相关资料