变态的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; } }