@Data
public class QuartzTask<T extends Trigger> implements Serializable {
private static final long serialVersionUID = 1L;
private ScheduleBuilder<T> scheduleBuilder;
private Date startTime;
private Date endTime;
private String timezone;
public QuartzTask(ScheduleBuilder<T> scheduleBuilder, Date startTime, Date endTime) {
this.scheduleBuilder = scheduleBuilder;
this.startTime = startTime;
this.endTime = endTime;
}
public QuartzTask(Date startTime, Date endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
}
private Scheduler scheduler;
//添加任务
public void addScheduleJob(JobKey jobKey, Class clazz, List<QuartzTask> taskList, JobDataMap jobDataMap) {
try {
JobDetail jobDetail = JobBuilder
.newJob(clazz).withIdentity(jobKey).storeDurably(true).build();
if (scheduler.checkExists(jobDetail.getKey()))
throw new SchedulerException("job is already exists");
scheduler.addJob(jobDetail, true);
addJobTrigger(jobKey,taskList);
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
//暂停任务
public void pauseScheduleJob(JobKey jobKey) {
try {
if (!scheduler.checkExists(jobKey))
throw new SchedulerException("job is not exists");
scheduler.pauseJob(jobKey);
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
//删除任务
public void delScheduleJob (JobKey jobKey) {
try {
pauseScheduleJob(jobKey);
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
//恢复任务
public void resumeScheduleJob(JobKey jobKey){
try {
pauseScheduleJob(jobKey);
scheduler.resumeJob(jobKey);
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
//更新任务(仅对原有任务的trigger变更实际的开始时间和结束时间)
public void updateScheduleJob(JobKey jobKey, Class clazz, QuartzTask task, JobDataMap jobDataMap){
try {
if (!scheduler.checkExists(jobKey)) {
throw new RuntimeException("job is not exist");
} else {
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
for (Trigger trigger : triggers) {
Trigger newTrigger = trigger.getTriggerBuilder().startNow()
.startAt(task.getStartTime()).endAt(task.getEndTime())
.build();
scheduler.rescheduleJob(trigger.getKey(),newTrigger);
}
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
//批量暂停job
public void batchPauseJobs(List<JobKey> jobKeyList){
if(jobKeyList.size()==0)
throw new RuntimeException("job list is empty");
for (JobKey jobKey : jobKeyList) {
pauseScheduleJob(jobKey);
}
}
public void batchPauseJobs(List<String> groupList,String method){
if (!"group".equalsIgnoreCase(method))
throw new RuntimeException("only support method group");
if(groupList.size()==0)
throw new RuntimeException("group list is empty");
for (String group : groupList) {
try {
scheduler.pauseJobs(GroupMatcher.groupEquals(group));
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
}
//批量恢复任务
public void batchResumeJobs(List<JobKey> jobKeyList){
batchPauseJobs(jobKeyList);
for (JobKey jobKey : jobKeyList) {
resumeScheduleJob(jobKey);
}
}
public void batchResumeJobs(List<String> groupList,String method){
batchPauseJobs(groupList,method);
for (String group : groupList) {
try {
scheduler.resumeJobs(GroupMatcher.groupEquals(group));
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
}
//批量删除job
public void batchDelJobs(List<JobKey> jobKeyList){
batchPauseJobs(jobKeyList);
try {
scheduler.deleteJobs(jobKeyList);
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
//添加trigger
public void addJobTrigger(JobKey jobKey,List<QuartzTask> taskList){
try {
if (!scheduler.checkExists(jobKey))
throw new SchedulerException("job is not exists");
int size = scheduler.getTriggersOfJob(jobKey).size();
for (QuartzTask task : taskList) {
//创建任务触发器
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobKey.getName()+(size+taskList.indexOf(task)+1), jobKey.getGroup())
.withSchedule(task.getScheduleBuilder())
.startNow().forJob(jobKey)
.startAt(task.getStartTime()).endAt(task.getEndTime())
.build();
//将触发器与任务绑定到调度器内
scheduler.scheduleJob(trigger);
}
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
//暂停trigger
public void pauseJobTrigger(TriggerKey triggerKey) {
try {
if (!scheduler.checkExists(triggerKey))
throw new SchedulerException("trigger is not exists");
scheduler.pauseTrigger(triggerKey);
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
//更新trigger(更新trigger)
public void updateJobTrigger(TriggerKey triggerKey, QuartzTask task) {
try {
if (!scheduler.checkExists(triggerKey))
throw new SchedulerException("trigger is not exists");
Trigger newTrigger = scheduler.getTrigger(triggerKey).getTriggerBuilder()
.withSchedule(task.getScheduleBuilder())
.startNow().startAt(task.getStartTime()).endAt(task.getEndTime()).build();
scheduler.rescheduleJob(triggerKey,newTrigger);
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
//恢复trigger
public void resumeJobTrigger(TriggerKey triggerKey){
try {
if (!scheduler.checkExists(triggerKey))
throw new SchedulerException("trigger is not exists");
scheduler.resumeTrigger(triggerKey);
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
//删除trigger
public void delJobTrigger(TriggerKey triggerKey){
try {
pauseJobTrigger(triggerKey);
scheduler.unscheduleJob(triggerKey);
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
//批量暂停trigger
public void batchPauseTriggers(List<TriggerKey> triggerKeyList){
if(triggerKeyList.size()==0)
throw new RuntimeException("trigger list is empty");
for (TriggerKey triggerKey : triggerKeyList) {
pauseJobTrigger(triggerKey);
}
}
public void batchPauseTriggers(List<String> groupList,String method){
if (!"group".equalsIgnoreCase(method))
throw new RuntimeException("only support method group");
if(groupList.size()==0)
throw new RuntimeException("group list is empty");
for (String group : groupList) {
try {
scheduler.pauseTriggers(GroupMatcher.groupEquals(group));
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
}
//批量恢复trigger
public void batchResumeTriggers(List<TriggerKey> triggerKeyList){
batchPauseTriggers(triggerKeyList);
for (TriggerKey triggerKey : triggerKeyList) {
resumeJobTrigger(triggerKey);
}
}
public void batchResumeTriggers(List<String> groupList,String method){
batchPauseTriggers(groupList,method);
for (String group : groupList) {
try {
scheduler.resumeTriggers(GroupMatcher.groupEquals(group));
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}
}
//批量删除trigger
public void batchDelTriggers(List<TriggerKey> triggerKeyList){
batchPauseTriggers(triggerKeyList);
try {
scheduler.unscheduleJobs(triggerKeyList);
} catch (SchedulerException e) {
throw new RuntimeException(e.getMessage());
}
}