package me.test.first.quartz.a;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import org.quartz.DateBuilder;
import org.quartz.DateBuilder.IntervalUnit;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.ScheduleBuilder;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class QuartzDemo {
private Logger log = LoggerFactory.getLogger(QuartzDemo.class);
private Scheduler sched = null;
/**
* 示例主函数。接受一个参数,含义是与当前类同个package下的quartz资源文件的文件名。 <code>
* Usage: java QuartzDemo [|] [insertJob|start]
* </code>
*
* @param args
* @throws SchedulerException
*/
public static void main(String[] args) throws SchedulerException {
String filename = args[0];
final QuartzDemo demo = new QuartzDemo(filename);
String command = args[1];
if ("insertJob".equals(command)) {
demo.insertJob();
} else if ("start".equals(command)) {
demo.start();
}
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
demo.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
});
}
public QuartzDemo(String filename) throws SchedulerException {
Properties props = new Properties();
try {
props.load(QuartzDemo.class.getResourceAsStream(filename));
} catch (IOException e) {
throw new RuntimeException(e);
}
SchedulerFactory sf = new StdSchedulerFactory(props);
try {
sched = sf.getScheduler();
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
public void start() throws SchedulerException {
sched.start();
}
public void shutdown() throws SchedulerException {
if (sched.isStarted() && !sched.isShutdown()) {
sched.shutdown();
}
}
/**
* 新建一个Job,并为其分配一个trigger。
*
* @throws SchedulerException
*/
public void insertJob() throws SchedulerException {
String schedId = sched.getSchedulerInstanceId();
// new job
String jobName = "jobA";
String jobGroup = schedId;
JobKey jobKey = new JobKey(jobName, jobGroup);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("jobA.data.key[1]", "1");
jobDataMap.put("jobA.data.key[2]", "1");
JobDetail jobDetail = JobBuilder.newJob(JobA.class)
.withIdentity(jobKey).usingJobData(jobDataMap)
.requestRecovery().build();
sched.addJob(jobDetail, true);
// setup trigger
updateJob();
}
/**
*
* @throws SchedulerException
*/
public void updateJob() throws SchedulerException {
String schedId = sched.getSchedulerInstanceId();
String jobName = "jobA";
String jobGroup = schedId;
JobKey jobKey = new JobKey(jobName, jobGroup);
// delete previous triggers
List<? extends Trigger> triggers = sched.getTriggersOfJob(jobKey);
int preInteval = 0;
if (triggers != null) {
for (Trigger trigger : triggers) {
try {
preInteval = trigger.getJobDataMap().getInt("jobA.data[3]");
} catch (Exception e) {
log.error("Could not found previous data for jobA", e);
}
TriggerKey triggerKey = trigger.getKey();
sched.unscheduleJob(triggerKey);
}
}
int inteval = preInteval;
inteval++;
inteval = preInteval % 5 + 5; // 5~9
// new trigger for the job
String triggerName = "jobA.trigger";
String triggerGroup = schedId;
Date startTime = DateBuilder.futureDate(2, IntervalUnit.SECOND);
// CalendarIntervalScheduleBuilder
// CronScheduleBuilder
// DailyTimeIntervalScheduleBuilder
// SimpleScheduleBuilder
ScheduleBuilder<? extends Trigger> scheduleBuilder = SimpleScheduleBuilder
.simpleSchedule().withRepeatCount(2000)
.withIntervalInSeconds(inteval);
JobDataMap triggerJobDataMap = new JobDataMap();
triggerJobDataMap.put("jobA.data[2]", "22");
triggerJobDataMap.put("jobA.data[3]", Integer.toString(inteval));
Date endTime = DateBuilder.futureDate(30, IntervalUnit.MINUTE);
Trigger trigger = TriggerBuilder.newTrigger().forJob(jobKey)
.withIdentity(triggerName, triggerGroup).startAt(startTime)
.withSchedule(scheduleBuilder).endAt(endTime)
.usingJobData(triggerJobDataMap).build();
sched.scheduleJob(trigger);
}
/**
* 删除指定的Job以及其关联的Trigger。
*
* @throws SchedulerException
*/
public void deleteJob() throws SchedulerException {
String schedId = sched.getSchedulerInstanceId();
String triggerName = "jobA.trigger";
String triggerGroup = schedId;
sched.unscheduleJob(new TriggerKey(triggerName, triggerGroup));
}
}