只使用spring容器生成 Scheduler 调度器对象 ,添加任务、删除任务、停止任务、启动任务全部使用quartz框架的方法及类。
通过下面的类对调度器中的任务及触发器进行操作 Scheduler对象从spring中获取 JobInfo对象为自定义的任务信息。
QuartzJob 是自定义的实现quartz的Job接口的任务,类中编写自己的业务逻辑。
/**
* 对quartz调度器中的任务进行操作
*
* @author Administrator
*
*/
public class ScheduleJob {
/**
* 将任务上下文中的任务添加quartz的调度器
*
* @param s
* @throws SchedulerException
*/
public void schedule(Scheduler s) throws SchedulerException {
// 获取任务信息
List<JobInfo> infoList = JobDataContext.getJobInfoList();
for (JobInfo info : infoList) {
this.addJob2Scheduler(s, info);
}
}
/**
* 将任务添加到quartz调度器
* @param s
* @param info
* @throws SchedulerException
*/
public void addJob2Scheduler(Scheduler s,JobInfo info) throws SchedulerException
{
TriggerKey triggerKey = TriggerKey.triggerKey(info.getJobName(),
info.getJobGroup());
CronTrigger cronTrigger = (CronTrigger) (s.getTrigger(triggerKey));
if (cronTrigger == null) {
// 任务未添加到调度器
JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
.withIdentity(info.getJobName(), info.getJobGroup())
.build();
jobDetail.getJobDataMap().put("jobinfo", info);
CronScheduleBuilder cs = CronScheduleBuilder.cronSchedule(info
.getCronExpression());
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(info.getJobName(), info.getJobGroup())
.withSchedule(cs).build();
trigger.getJobDataMap().put("jobinfo", info);
s.scheduleJob(jobDetail, trigger);
} else {
// 任务已经添加更新crontrigger
CronScheduleBuilder cs = CronScheduleBuilder.cronSchedule(info
.getCronExpression());
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(info.getJobName(), info.getJobGroup())
.withSchedule(cs).build();
s.rescheduleJob(triggerKey, trigger);
}
}
/**
* 获取quartz中计划的任务
* @param scheduler
* @return
* @throws SchedulerException
*/
public List<JobInfo> getPlainJobinScheduler(Scheduler scheduler) throws SchedulerException
{
GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
List<JobInfo> jobInfoList = new ArrayList<JobInfo>();
for (JobKey jobKey : jobKeys) {
List<? extends Trigger> triggers = scheduler
.getTriggersOfJob(jobKey);
for (Trigger trigger : triggers) {
JobInfo oldinfo = (JobInfo)trigger.getJobDataMap().get("jobinfo");
JobInfo jobinfo = new JobInfo();
jobinfo.setJobName(jobKey.getName());
jobinfo.setJobGroup(jobKey.getGroup());
jobinfo.setJobId(oldinfo.getJobId());
jobinfo.setCronExpression(oldinfo.getCronExpression());
jobinfo.setJobDesc("触发器:" + trigger.getKey());
jobinfo.setJobTable(oldinfo.getJobTable());
jobinfo.setJobType(oldinfo.getJobType());
jobinfo.setJobSql(oldinfo.getJobSql());
Trigger.TriggerState triggerState = scheduler
.getTriggerState(trigger.getKey());
jobinfo.setJobStatus(triggerState.name());
if (trigger instanceof CronTrigger) {
CronTrigger cronTrigger = (CronTrigger) trigger;
String cronExpression = cronTrigger.getCronExpression();
jobinfo.setCronExpression(cronExpression);
}
jobInfoList.add(jobinfo);
}
}
return jobInfoList;
}
/**
* quartz调度器暂停任务调度
* @param s
* @param jobinfo
* @throws SchedulerException
*/
public void pauseJob(Scheduler s,JobInfo jobinfo) throws SchedulerException
{
JobKey jobKey = JobKey.jobKey(jobinfo.getJobName(), jobinfo.getJobGroup());
s.pauseJob(jobKey);
}
/**
* quartz调度器恢复任务调度
* @param s
* @param jobinfo
* @throws SchedulerException
*/
public void resumeJob(Scheduler s,JobInfo jobinfo) throws SchedulerException
{
JobKey jobKey = JobKey.jobKey(jobinfo.getJobName(), jobinfo.getJobGroup());
s.resumeJob(jobKey);
}
/**
* quartz调度器删除任务
* @param s
* @param jobinfo
* @throws SchedulerException
*/
public void deleteJob(Scheduler s,JobInfo jobinfo) throws SchedulerException
{
JobKey jobKey = JobKey.jobKey(jobinfo.getJobName(), jobinfo.getJobGroup());
s.deleteJob(jobKey);
}
/**
* quartz调度器立刻运行任务(只运行一次,随机生成Trigger)
* @param s
* @param jobinfo
* @throws SchedulerException
*/
public void runJobOneTime(Scheduler s,JobInfo jobinfo) throws SchedulerException
{
JobKey jobKey = JobKey.jobKey(jobinfo.getJobName(), jobinfo.getJobGroup());
s.triggerJob(jobKey);
}
}