变态的PM需求。虽然看上去很简单。但网上资源其实不多,走了不少弯路。分享一下。
quartz 的Scheduler 的主要代码
public void addSchduleJob(Task entity) throws SchedulerException {
JobKey jobKeyA = new JobKey(entity.getId()+"");
JobDetail jobA = JobBuilder.newJob(com.baidu.lightapp.quartz.schedule.QuartzJob.class).usingJobData("id", entity.getId())
.withIdentity(jobKeyA).build();
Trigger trigger1 = TriggerBuilder
.newTrigger()
.withIdentity(entity.getId()+"")
.withSchedule(
CronScheduleBuilder.cronSchedule(entity.getTitle()))
.build();
Scheduler scheduler = localQuartzScheduler.getScheduler();
scheduler.scheduleJob(jobA, trigger1);
}
public void updateSchduleJob(Task entity) throws SchedulerException, ParseException {
Scheduler scheduler = localQuartzScheduler.getScheduler();
TriggerKey triggerKey = new TriggerKey(entity.getId()+"");
CronTriggerImpl trigger = (CronTriggerImpl) scheduler.getTrigger(triggerKey);
if (trigger == null) {
addSchduleJob(entity);
} else {
trigger.setCronExpression(entity.getTitle());
scheduler.rescheduleJob(triggerKey, trigger);
}
}
public void deleteScheduleJob(Task entity) throws SchedulerException, ParseException {
Scheduler scheduler = localQuartzScheduler.getScheduler();
TriggerKey triggerKey = new TriggerKey(entity.getId()+"");
CronTriggerImpl trigger = (CronTriggerImpl) scheduler.getTrigger(triggerKey);
if (trigger != null) {
scheduler.unscheduleJob(triggerKey);
}
}
主要的业务类。需要继承org.quartz.Job
public class QuartzJob implements Job {
private static final Logger logger = LoggerFactory.getLogger(QuartzJob.class);
public QuartzJob() {
}
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
TaskService taskService = (TaskService)SpringContextHolderUtil.getBean("taskService");
Task task = taskService.getTask(context.getJobDetail().getJobDataMap().getLong("id"));
Long id = context.getJobDetail().getJobDataMap().getLong("id");
logger.info("ID:{}, title:{}", task.getId(), task.getTitle());
TaskLog taskLog = new TaskLog();
taskLog.setTaskId(task.getId());
// 请求操作BEGIN
// TODO
taskLog = mainJob(task, taskLog);
// 请求操作END
taskService.saveTaskLog(taskLog);
}
public TaskLog mainJob(Task task, TaskLog taskLog) {
return taskLog;
}
}