之前在我们的项目中引入了quartz框架,来实现分布式自动任务处理。之后提出的需求是:希望能够在管理系统中可以 查看所有任务、暂停/启用自动任务、动态新增/删除、立即执行、修改cron表达式等
最后经过查看官网文档和网上各位网友的资料,终于顺利完成了该需求,下边与大家分享一下:
一、查看自动任务列表
public List<QuartzTrigger> queryTriggerList() {
try {
GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
List<QuartzTrigger> jobList = new ArrayList<QuartzTrigger>();
for (JobKey jobKey : jobKeys) {
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
for (Trigger trigger : triggers) {
QuartzTrigger job = new QuartzTrigger();
job.setSchedulerName(scheduler.getSchedulerName());
job.setJobName(jobKey.getName());
job.setJobGroup(jobKey.getGroup());
job.setTriggerName(trigger.getKey().getName());
job.setTriggerGroup(trigger.getKey().getGroup());
job.setNextFireTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(trigger.getNextFireTime()));
Date previousFireTime = trigger.getPreviousFireTime();
if(previousFireTime != null) {
job.setPrevFireTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(previousFireTime));
}
Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
job.setStatus(triggerState.name());
if (trigger instanceof CronTrigger) {
CronTrigger cronTrigger = (CronTrigger) trigger;
String cronExpression = cronTrigger.getCronExpression();
job.setCron(cronExpression);
}
jobList.add(job);
}
}
return jobList;
}catch (SchedulerException e) {
logger.error("获取自动任务列表失败",e);
throw new SeaException("QRT006","获取自动任务列表失败");
}
}
二、暂停指定任务
public void pauseTrigger(String triggerName,String triggerGroupName) {
try {
logger.debug("暂停任务触发器:" + triggerName);
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroupName);
scheduler.pauseTrigger(triggerKey);
} catch (SchedulerException e) {
logger.error("暂停任务触发器失败:" + triggerName,e);
throw new SeaException("QRT006","暂停任务触发器失败:" + triggerName);
}
}
三、重新启用某自动任务
public void resumeTrigger(String triggerName ,String triggerGroup ) {
try {
logger.debug("启用任务触发器:" + triggerName);
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroup);
scheduler.resumeTrigger(triggerKey);
} catch (SchedulerException e) {
logger.error("启用任务触发器失败:" + triggerName,e);
throw new SeaException("QRT005","启用任务触发器失败:" + triggerName);
}
}
四、删除制定任务
public void delTrigger(String triggerName,String triggerGroup,String jobName,String jobGroup) {
try {
logger.debug("移除任务触发器:" + triggerName);
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroup);
scheduler.pauseTrigger(triggerKey); //暂停触发器
scheduler.unscheduleJob(triggerKey); //移除触发器
JobKey jobKey = JobKey.jobKey(jobName,jobGroup);
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
logger.error("移除任务触发器失败:" + triggerName,e);
throw new SeaException("QRT004","移除任务触发器失败:" + triggerName);
}
}
五、立即执行任务
public void runjob(String jobName,String jobGroup) {
try {
logger.debug("立即执行任务:" + jobName);
JobKey jobKey = JobKey.jobKey(jobName,jobGroup);
scheduler.triggerJob(jobKey);
} catch (SchedulerException e) {
logger.error("立即执行任务失败:" + jobName,e);
throw new SeaException("QRT002","立即执行任务失" + jobName);
}
}
六、新增任务
public void addjob(String jobName,String jobGroupName,String cron) {
logger.debug("添加自动任务:" + jobName);
Job job = (Job)exContextUtils.getBean(jobName);
try {
JobDetail jobDetail = null;
if(StringUtils.isEmpty(jobGroupName)) {
jobGroupName = QuartzConstants.JOB_GROUP_NAME;
}
jobDetail = JobBuilder.newJob(job.getClass()).withIdentity(jobName, jobGroupName).build();// 任务名,任务组,任务执行类
// 触发器
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName).withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
// 启动
if (scheduler.isShutdown()) {
scheduler.start();
}
} catch (Exception e) {
logger.error("添加自动任务失败:" + jobName,e);
throw new SeaException("QRT001","添加自动任务失败");
}
}
七、修改cron表达式
public void updateJobCron(String triggerName,String triggerGroupName,String cron) {
try{
if(StringUtils.isEmpty(triggerGroupName)) {
triggerGroupName = QuartzConstants.TRIGGER_GROUP_NAME;
}
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
if(triggerKey!=null){
TriggerBuilder<CronTrigger> triggerBuilder = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder);
trigger = triggerBuilder.build();
}
scheduler.rescheduleJob(triggerKey, trigger);
((CronTriggerImpl)trigger).setStartTime(new Date());
}catch (Exception e) {
logger.error("自动任务cron表达式修改失败",e);
throw new SeaException("QRT007","添加自动任务失败");
}
}
QuartzTrigger的实现
public class QuartzTrigger {
private String schedulerName;
private String triggerName;
private String triggerGroup;
private String jobName;
private String jobGroup;
private String nextFireTime;
private String prevFireTime;
private String status;
private String cron;
public String getSchedulerName() {
return schedulerName;
}
public void setSchedulerName(String schedulerName) {
this.schedulerName = schedulerName;
}
public String getTriggerName() {
return triggerName;
}
public void setTriggerName(String triggerName) {
this.triggerName = triggerName;
}
public String getTriggerGroup() {
return triggerGroup;
}
public void setTriggerGroup(String triggerGroup) {
this.triggerGroup = triggerGroup;
}
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public String getJobGroup() {
return jobGroup;
}
public void setJobGroup(String jobGroup) {
this.jobGroup = jobGroup;
}
public String getNextFireTime() {
return nextFireTime;
}
public void setNextFireTime(String nextFireTime) {
this.nextFireTime = nextFireTime;
}
public String getPrevFireTime() {
return prevFireTime;
}
public void setPrevFireTime(String prevFireTime) {
this.prevFireTime = prevFireTime;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getCron() {
return cron;
}
public void setCron(String cron) {
this.cron = cron;
}
}
以上是我们项目中的实现方式,很多参考了网上的自量,可能和网上有雷同,还行各位同仁勿喷。