pause : 暂停一个触发器。如果是持久化的 quartz,此触发器的状态会被写到库中,哪怕是重启应用后,
也不会触发,因为状态是持久化的。
若更新 quartz 配置文件中的该触发器的属性,如 cron 表达式,则内存和数据库中已持久化的数据都不会被更新。
resume : 重置一个触发器的状态为运行状态,下次可调度。对一个不处于 pause 状态的触发器调用此方法无效果。此方法会改变触发器的持久化状态。
remove : 删除一个触发器(若是 cron 触发器,则它关联的 job 也会被删除),此处,删除的含义是,内存中删除,若是持久化 quartz,则库中的 trigger 和 job 也会被删除。
重启应用后,若原来的配置文件不变更,则被删除的 trigger 和 job 会被加回来,并且处于可触发的状态。
以下是完整的管理类。
package org.summer.spi.quartz;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.summer.exception.spe.SummerException;
import org.summer.spi.spe.JobTriggerManageService;
public class JobTriggerManagerServiceImpl implements JobTriggerManageService {
private Scheduler scheduler;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
}
public JobTriggerManagerServiceImpl() {
// TODO Auto-generated constructor stub
}
@Override
public List
以上管理类只适用于 1.8 及以下版本的 Quartz,对于新版本,Scheduler 不再提供一些方法,不再适用。下面给出适用于新版本的触发器管理类
package ---.---.---.service.impl;
/**
* 和老版本 Quartz 的触发器管理类 JobTriggerManagerServiceImpl.java 的实现不一样,新版本的 Quartz 减少了一些接口,加入了新接口。
* 如不再提供 triggerJobWithVolatileTrigger 方法。“立即触发功能” 可以使用 java 反射做。
*
*/
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.webank.mbp.ccsm.service.JobTriggerManageService;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class JobTriggerManagerServiceImpl implements JobTriggerManageService,ApplicationContextAware {
@Autowired
SchedulerFactoryBean schedulerFactoryBean;
private static ApplicationContext applicationContext; // Spring应用上下文环境
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public JobTriggerManagerServiceImpl() {
// TODO Auto-generated constructor stub
}
@Override
public List> getQrtzTriggers() throws SchedulerException
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Scheduler scheduler = schedulerFactoryBean.getScheduler();
GroupMatcher matcher = GroupMatcher.anyTriggerGroup();
Set triggerKeys = scheduler.getTriggerKeys(matcher);
List triggerGroupNames = scheduler.getTriggerGroupNames();
List> triggersInfo = new ArrayList();
for(TriggerKey key : triggerKeys)
{
Trigger trigger = scheduler.getTrigger(key);
Map curInfo = new HashMap<>();
if(trigger instanceof CronTrigger)
{
curInfo.put("cron", ((CronTrigger)trigger).getCronExpression());
}
else
{
curInfo.put("cron","非 cron 触发器");
}
curInfo.put("group",key.getGroup());
curInfo.put("name", key.getName());
curInfo.put("status", scheduler.getTriggerState(key));
curInfo.put("lastTriggerTime", null != trigger.getPreviousFireTime() ? sdf.format(trigger.getPreviousFireTime()) : "");
curInfo.put("nextTriggerTime", null != trigger.getNextFireTime() ? sdf.format(trigger.getNextFireTime()) : "");
curInfo.put("startTriggerTime", null != trigger.getStartTime() ? sdf.format(trigger.getStartTime()) : "");
curInfo.put("endTriggerTime", null != trigger.getEndTime() ? sdf.format(trigger.getEndTime()) : "");
triggersInfo.add(curInfo);
}
return triggersInfo;
}
@Override
public void pauseTrigger(String triggerName, String group) throws SchedulerException{
schedulerFactoryBean.getScheduler().pauseTrigger(new TriggerKey(triggerName, group));
}
@Override
public void resumeTrigger(String triggerName, String group) throws SchedulerException{
schedulerFactoryBean.getScheduler().resumeTrigger(new TriggerKey(triggerName, group));
}
@Override
public void removeTrigger(String triggerName, String group) throws SchedulerException{
Set keys = getStrictRelativeJob(triggerName, group);
schedulerFactoryBean.getScheduler().unscheduleJob(new TriggerKey(triggerName, group));
List keyList = new ArrayList<>();
keyList.addAll(keys);
schedulerFactoryBean.getScheduler().deleteJobs(keyList);
}
/*
* 获得一个 trigger 强关联的 job. 即 job 只与这一个 trigger 相关联
*/
private Set getStrictRelativeJob(String triggerName, String group) throws SchedulerException
{
Set rets = new HashSet<>();
Scheduler scheduler = schedulerFactoryBean.getScheduler();
TriggerKey target = new TriggerKey(triggerName, group);
Set jobKeys = scheduler.getJobKeys(GroupMatcher.anyJobGroup());//GroupMatcher.jobGroupEquals(group)
for(JobKey key : jobKeys)
{
List triggers = (List) scheduler.getTriggersOfJob(key);
if(null != triggers && 1 == triggers.size()
&& triggers.get(0).getKey().equals(target))
{
rets.add(key);
}
}
return rets;
}
private void triggerRightNow(JobKey jobKey) throws SchedulerException
{
Scheduler scheduler = schedulerFactoryBean.getScheduler();
Class jobClass = scheduler.getJobDetail(jobKey).getJobClass();
Job jobObj = (Job)applicationContext.getBean(jobClass);
try
{
Method targetMethod = jobClass.getDeclaredMethod("executeInternal", new Class[] {JobExecutionContext.class});
targetMethod.setAccessible(true);
targetMethod.invoke(jobObj, new Object[]{null});
targetMethod.setAccessible(false);
}
catch(Exception e)
{
throw new SchedulerException(e);
}
}
@Autowired
ObjectMapper json;
@Override
public String triggerRelativeJobsRightNow(String triggerName, String group)throws SchedulerException{
StringBuilder sb = new StringBuilder();
Scheduler scheduler = schedulerFactoryBean.getScheduler();
Trigger trigger = scheduler.getTrigger(new TriggerKey(triggerName, group));
Set jobKeys = getStrictRelativeJob(triggerName, group);
for(JobKey key : jobKeys)
{
triggerRightNow(key);
sb.append(key.getGroup() + "." + key.getName()).append(" | ");
}
if(0 != sb.length())
sb.delete(sb.length() - " | ".length(), sb.length());
return sb.toString();
}
}