Java 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