Quartz定时器
package quartz; import static org.quartz.CronScheduleBuilder.cronSchedule; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * job 作业配置 * @author Administrator * */ public class CronTriggerCfg { public void run() throws Exception { Logger log = LoggerFactory.getLogger(CronTriggerCfg.class); //System.out.println("------- Initializing -------------------"); log.info("------- Initializing -------------------"); SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); log.info("------- 添加定时作业;每50秒执行一次 -------------------"); JobDetail job = newJob(DocUnfiledJob.class).withIdentity("job1", "group1").build(); CronTrigger trigger = newTrigger().withIdentity("trigger1", "group1") .withSchedule(cronSchedule("0/50 * * * * ?")).build(); Date ft = sched.scheduleJob(job, trigger); //System.out.println(job.getKey() + ">>>从: " + sdf.format(ft) + "开始执行 and repeat based on expression: " // + trigger.getCronExpression()); log.info(job.getKey() + ">>>从: " + sdf.format(ft) + "开始执行 and repeat based on expression: " + trigger.getCronExpression()); sched.start(); } public static void main(String[] args) throws Exception { CronTriggerCfg example = new CronTriggerCfg(); example.run(); } }
- Scheduler:调度器。所有的调度都是由它控制。
- Trigger: 定义触发的条件。例子中,它的类型是SimpleTrigger,每隔1秒中执行一次(什么是SimpleTrigger下面会有详述)。
- JobDetail & Job: JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中,例子中是HelloQuartz。 为什么设计成JobDetail + Job,不直接使用Job?这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题
package quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyJob implements Job{ Logger _log = LoggerFactory.getLogger(MyJob.class); public MyJob(){ } public void execute(JobExecutionContext context) throws JobExecutionException { JobKey jobKey = context.getJobDetail().getKey(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); _log.info("-------------------------作业开始: " + jobKey + " executing at " + sdf.format(new Date())); new Start().runDocUnfiled();//业务处理类 _log.info("+++++++++++++++++++++++++作业结束: " + jobKey + " executing at " + sdf.format(new Date())); } }
业务处理:
package quartz; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 业务处理类 * * @author Administrator * */ public class Start { Logger log = LoggerFactory.getLogger(Start.class); public void runUnfiled() { log.info("-----业务开始------------"); System.out.println("业务处理"); log.info("--------业务结束-------"); } }
项目中需要jar如下:下载地址
log4j-1.2.16.jar
quartz-2.2.3.jar
quartz-jobs-2.2.3.jar
slf4j-api-1.7.7.jar
slf4j-log4j12-1.7.7.jar