定时任务经常使用,从未研究其内部原理等。实际项目中多机部署时遇到问题,项目部署在不同服务器上。同一时间同时启动怕出现错误。于是有了此篇文章。
首先先从简单的demo入手(log4j.properties未配置,任务调度的运行信息在内存):
使用SimpleTrigger
1. 新建了一个Java类让它实现quartz的job方法,这就是一个简单的job。
/**
* 简单的job类
*
*/
public class SimpleJob implements Job{
@Override
public void execute(JobExecutionContext jobContext) throws JobExecutionException {
System.out.println("jobContext.getTrigger():"+jobContext.getTrigger().getJobDataMap()+"时间"+new Date());
}
}
2.Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。因此我们还需要创建一个JobDetail实例并且指定是那个job.最后定义我们的触发规则类,只有触发规则和我们的job关联起来才能实现我们想要的功能。
public class SimpleTrigger {
public static void main(String[] args) throws SchedulerException {
// 定义一个jobDetail
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class).build();
// 定义一个触发规则每5秒触发一次总计3次
Trigger trigger = TriggerBuilder.newTrigger()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5).withRepeatCount(3))
.build();
//通过SchedulerFactory获取一个调度器实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
//启动调度
scheduler.start();
}
}
执行结果: 刚启动有一次定义了三次共4次
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2018-03-09 10:56:38Hello Quartz!
2018-03-