[ server ] - add quartz and knife4j framework
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
package io.wdd.rpc.scheduler.config;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
/**
|
||||
* @author Andya
|
||||
* @create 2021/04/01
|
||||
*/
|
||||
@ApiModel(value = "更新job cron时间参数")
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class UpdateJobBean {
|
||||
@ApiModelProperty(value = "jobTime的cron表达式", example = "0 0 1 * * ?")
|
||||
String jobCronTime;
|
||||
|
||||
public String getJobCronTime() {
|
||||
return jobCronTime;
|
||||
}
|
||||
|
||||
public void setJobCronTime(String jobCronTime) {
|
||||
this.jobCronTime = jobCronTime;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package io.wdd.rpc.scheduler.service;
|
||||
|
||||
import org.springframework.scheduling.quartz.QuartzJobBean;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
public interface OctopusQuartzService {
|
||||
|
||||
/**
|
||||
* 增加一个任务job
|
||||
* @param jobClass 任务job实现类
|
||||
* @param jobName 任务job名称(保证唯一性)
|
||||
* @param jobGroupName 任务job组名
|
||||
* @param jobTime 任务时间间隔(秒)
|
||||
* @param jobTimes 任务运行次数(若<0,则不限次数)
|
||||
* @param jobData 任务参数
|
||||
*/
|
||||
void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, int jobTime,
|
||||
int jobTimes, Map jobData);
|
||||
|
||||
/**
|
||||
* 增加一个任务job
|
||||
* @param jobClass 任务job实现类
|
||||
* @param jobName 任务job名称(保证唯一性)
|
||||
* @param jobGroupName 任务job组名
|
||||
* @param jobTime 任务时间表达式
|
||||
* @param jobData 任务参数
|
||||
*/
|
||||
void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, String jobTime, Map jobData);
|
||||
|
||||
/**
|
||||
* 修改一个任务job
|
||||
* @param jobName 任务名称
|
||||
* @param jobGroupName 任务组名
|
||||
* @param jobTime cron时间表达式
|
||||
*/
|
||||
void updateJob(String jobName, String jobGroupName, String jobTime);
|
||||
|
||||
/**
|
||||
* 删除一个任务job
|
||||
* @param jobName
|
||||
* @param jobGroupName
|
||||
*/
|
||||
void deleteJob(String jobName, String jobGroupName);
|
||||
|
||||
/**
|
||||
* 暂停一个任务job
|
||||
* @param jobName
|
||||
* @param jobGroupName
|
||||
*/
|
||||
void pauseJob(String jobName, String jobGroupName);
|
||||
|
||||
/**
|
||||
* 恢复一个任务job
|
||||
* @param jobName
|
||||
* @param jobGroupName
|
||||
*/
|
||||
void resumeJob(String jobName, String jobGroupName);
|
||||
|
||||
/**
|
||||
* 立即执行一个任务job
|
||||
* @param jobName
|
||||
* @param jobGroupName
|
||||
*/
|
||||
void runAJobNow(String jobName, String jobGroupName);
|
||||
|
||||
/**
|
||||
* 获取所有任务job
|
||||
* @return
|
||||
*/
|
||||
List<Map<String, Object>> queryAllJob();
|
||||
|
||||
/**
|
||||
* 获取正在运行的任务job
|
||||
* @return
|
||||
*/
|
||||
List<Map<String, Object>> queryRunJob();
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,287 @@
|
||||
package io.wdd.rpc.scheduler.service;
|
||||
|
||||
import io.wdd.common.handler.MyRuntimeException;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.quartz.*;
|
||||
import org.quartz.DateBuilder.IntervalUnit;
|
||||
import org.quartz.impl.matchers.GroupMatcher;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.quartz.QuartzJobBean;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author Andya
|
||||
* @date 2021/4/01
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class OctopusQuartzServiceImpl implements OctopusQuartzService {
|
||||
|
||||
@Autowired
|
||||
private Scheduler scheduler;
|
||||
|
||||
@PostConstruct
|
||||
public void startScheduler() {
|
||||
try {
|
||||
scheduler.start();
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加一个job
|
||||
*
|
||||
* @param jobClass
|
||||
* 任务实现类
|
||||
* @param jobName
|
||||
* 任务名称
|
||||
* @param jobGroupName
|
||||
* 任务组名
|
||||
* @param jobTime
|
||||
* 时间表达式 (这是每隔多少秒为一次任务)
|
||||
* @param jobTimes
|
||||
* 运行的次数 (<0:表示不限次数)
|
||||
* @param jobData
|
||||
* 参数
|
||||
*/
|
||||
@Override
|
||||
public void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, int jobTime,
|
||||
int jobTimes, Map jobData) {
|
||||
try {
|
||||
// 任务名称和组构成任务key
|
||||
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName)
|
||||
.build();
|
||||
// 设置job参数
|
||||
if(jobData!= null && jobData.size()>0){
|
||||
jobDetail.getJobDataMap().putAll(jobData);
|
||||
}
|
||||
// 使用simpleTrigger规则
|
||||
Trigger trigger = null;
|
||||
if (jobTimes < 0) {
|
||||
trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)
|
||||
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withIntervalInSeconds(jobTime))
|
||||
.startNow().build();
|
||||
} else {
|
||||
trigger = TriggerBuilder
|
||||
.newTrigger().withIdentity(jobName, jobGroupName).withSchedule(SimpleScheduleBuilder
|
||||
.repeatSecondlyForever(1).withIntervalInSeconds(jobTime).withRepeatCount(jobTimes))
|
||||
.startNow().build();
|
||||
}
|
||||
log.info("jobDataMap: {}", jobDetail.getJobDataMap().getWrappedMap());
|
||||
scheduler.scheduleJob(jobDetail, trigger);
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
throw new MyRuntimeException("add job error!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加一个job
|
||||
*
|
||||
* @param jobClass
|
||||
* 任务实现类
|
||||
* @param jobName
|
||||
* 任务名称(建议唯一)
|
||||
* @param jobGroupName
|
||||
* 任务组名
|
||||
* @param jobTime
|
||||
* 时间表达式 (如:0/5 * * * * ? )
|
||||
* @param jobData
|
||||
* 参数
|
||||
*/
|
||||
@Override
|
||||
public void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, String jobTime, Map jobData) {
|
||||
try {
|
||||
// 创建jobDetail实例,绑定Job实现类
|
||||
// 指明job的名称,所在组的名称,以及绑定job类
|
||||
// 任务名称和组构成任务key
|
||||
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName)
|
||||
.build();
|
||||
// 设置job参数
|
||||
if(jobData!= null && jobData.size()>0){
|
||||
jobDetail.getJobDataMap().putAll(jobData);
|
||||
}
|
||||
// 定义调度触发规则
|
||||
// 使用cornTrigger规则
|
||||
// 触发器key
|
||||
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)
|
||||
.startAt(DateBuilder.futureDate(1, IntervalUnit.SECOND))
|
||||
.withSchedule(CronScheduleBuilder.cronSchedule(jobTime)).startNow().build();
|
||||
// 把作业和触发器注册到任务调度中
|
||||
scheduler.scheduleJob(jobDetail, trigger);
|
||||
log.info("jobDataMap: {}", jobDetail.getJobDataMap());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new MyRuntimeException("add job error!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改 一个job的 时间表达式
|
||||
*
|
||||
* @param jobName
|
||||
* @param jobGroupName
|
||||
* @param jobTime
|
||||
*/
|
||||
@Override
|
||||
public void updateJob(String jobName, String jobGroupName, String jobTime) {
|
||||
try {
|
||||
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
|
||||
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
||||
log.info("new jobTime: {}", jobTime);
|
||||
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
|
||||
.withSchedule(CronScheduleBuilder.cronSchedule(jobTime)).build();
|
||||
// 重启触发器
|
||||
scheduler.rescheduleJob(triggerKey, trigger);
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
throw new MyRuntimeException("update job error!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除任务一个job
|
||||
*
|
||||
* @param jobName
|
||||
* 任务名称
|
||||
* @param jobGroupName
|
||||
* 任务组名
|
||||
*/
|
||||
@Override
|
||||
public void deleteJob(String jobName, String jobGroupName) {
|
||||
try {
|
||||
scheduler.deleteJob(new JobKey(jobName, jobGroupName));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new MyRuntimeException("delete job error!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 暂停一个job
|
||||
*
|
||||
* @param jobName
|
||||
* @param jobGroupName
|
||||
*/
|
||||
@Override
|
||||
public void pauseJob(String jobName, String jobGroupName) {
|
||||
try {
|
||||
JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
|
||||
scheduler.pauseJob(jobKey);
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
throw new MyRuntimeException("pause job error!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 恢复一个job
|
||||
*
|
||||
* @param jobName
|
||||
* @param jobGroupName
|
||||
*/
|
||||
@Override
|
||||
public void resumeJob(String jobName, String jobGroupName) {
|
||||
try {
|
||||
JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
|
||||
scheduler.resumeJob(jobKey);
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
throw new MyRuntimeException("resume job error!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 立即执行一个job
|
||||
*
|
||||
* @param jobName
|
||||
* @param jobGroupName
|
||||
*/
|
||||
@Override
|
||||
public void runAJobNow(String jobName, String jobGroupName) {
|
||||
try {
|
||||
JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
|
||||
scheduler.triggerJob(jobKey);
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
throw new MyRuntimeException("run a job error!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有计划中的任务列表
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<Map<String, Object>> queryAllJob() {
|
||||
List<Map<String, Object>> jobList = null;
|
||||
try {
|
||||
GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
|
||||
Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
|
||||
jobList = new ArrayList<Map<String, Object>>();
|
||||
for (JobKey jobKey : jobKeys) {
|
||||
log.info("maps: {}", scheduler.getJobDetail(jobKey).getJobDataMap().getWrappedMap());
|
||||
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
|
||||
for (Trigger trigger : triggers) {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("jobName", jobKey.getName());
|
||||
map.put("jobGroupName", jobKey.getGroup());
|
||||
map.put("description", "触发器:" + trigger.getKey());
|
||||
Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
|
||||
map.put("jobStatus", triggerState.name());
|
||||
if (trigger instanceof CronTrigger) {
|
||||
CronTrigger cronTrigger = (CronTrigger) trigger;
|
||||
String cronExpression = cronTrigger.getCronExpression();
|
||||
map.put("jobTime", cronExpression);
|
||||
}
|
||||
jobList.add(map);
|
||||
}
|
||||
}
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
throw new MyRuntimeException("query all jobs error!");
|
||||
}
|
||||
return jobList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有正在运行的job
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<Map<String, Object>> queryRunJob() {
|
||||
List<Map<String, Object>> jobList = null;
|
||||
try {
|
||||
List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
|
||||
jobList = new ArrayList<Map<String, Object>>(executingJobs.size());
|
||||
for (JobExecutionContext executingJob : executingJobs) {
|
||||
Map<String, Object> map = new HashMap<String, Object>();
|
||||
JobDetail jobDetail = executingJob.getJobDetail();
|
||||
JobKey jobKey = jobDetail.getKey();
|
||||
Trigger trigger = executingJob.getTrigger();
|
||||
map.put("jobName", jobKey.getName());
|
||||
map.put("jobGroupName", jobKey.getGroup());
|
||||
map.put("description", "触发器:" + trigger.getKey());
|
||||
Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
|
||||
map.put("jobStatus", triggerState.name());
|
||||
if (trigger instanceof CronTrigger) {
|
||||
CronTrigger cronTrigger = (CronTrigger) trigger;
|
||||
String cronExpression = cronTrigger.getCronExpression();
|
||||
map.put("jobTime", cronExpression);
|
||||
}
|
||||
jobList.add(map);
|
||||
}
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
throw new MyRuntimeException("query run jobs error!");
|
||||
}
|
||||
return jobList;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user