記錄spring boot整合quartz實現定時任務
阿新 • • 發佈:2020-12-16
技術標籤:spring boot
1、新增maven依賴
程式碼如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、實現job介面,並在execute方法中實現業務邏輯
程式碼如下:
public class PrintWordsJob implements Job {
private static final Logger logger = LoggerFactory.getLogger(PrintWordsJob.class);
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String printTime = new SimpleDateFormat("yy-MM-dd HH:mm:ss").format(new Date ());
// 這裡處理簡單,只做列印時間,getMergedJobDataMap()方法是獲取 JobDetail 中傳遞的的 usingJobData
logger.info("PrintWordsJob start at: {}, map: {}", printTime, jobExecutionContext.getMergedJobDataMap().get("name"));
}
}
3、實現一個簡單的定時任務
程式碼如下:
public void test() throws SchedulerException {
// 定義作業的例項
JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)
// 任務標識,及任務分組
.withIdentity("job", "group")
// 連結呼叫,增加需要的引數
.usingJobData("name","guaniu")
.build();
// 觸發器
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
.withIdentity("trigger", "group")
// 立即執行
.startNow()
// 10s後停止
.endAt(new Date(System.currentTimeMillis()+10*1000))
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
// 每秒執行一次
.withIntervalInSeconds(1)
// 一直執行
.repeatForever()
).build();
scheduler.scheduleJob(jobDetail, simpleTrigger);
}
簡單封裝的工具類
程式碼如下:
@Component
public class QuartzUtils {
private static final Logger logger = LoggerFactory.getLogger(QuartzUtils.class);
@Autowired
private Scheduler scheduler;
/**
* @param quartzDataDomain
* {
* "jobName": "guaniu",
* "jobGroup": "test",
* "cron": "0/2 * * * * ?",
* "triggerName": "manual",
* "triggerGroup": "manualGroup",
* "usingJobDataMap": {
* "name": "guaniu"
* },
* "category": "create"
* }
* jobName、jobGroup要在前端傳值試效驗,保證唯一不重複,
* 否則會報錯:Unable to store Job : 'test1.guaniu1', because one already exists with this identification.
*/
public void operationQuartzJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
String category = quartzDataDomain.getCategory();
if (category.equals("create")){
createJob(quartzDataDomain);
}else if (category.equals("modify")){
modifyJob(quartzDataDomain);
}else if (category.equals("pause")){
pauseJob(quartzDataDomain);
}else if (category.equals("resume")){
resumeJob(quartzDataDomain);
}else if (category.equals("deleteJob")){
deleteJob(quartzDataDomain);
}
}
public void operationQuartzJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
String category = quartzDataDomain.getCategory();
if (category.equals("create")){
createJob(quartzDataDomain);
}else if (category.equals("modify")){
modifyJob(quartzDataDomain);
}else if (category.equals("pause")){
pauseJob(quartzDataDomain);
}else if (category.equals("resume")){
resumeJob(quartzDataDomain);
}else if (category.equals("deleteJob")){
deleteJob(quartzDataDomain);
}
}
// 建立並有執行job
private void createJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
// 如果這個任務存在就刪除
deleteJob(quartzDataDomain);
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzDataDomain.getCron());
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup())
.withSchedule(cronScheduleBuilder)
.build();
scheduler.scheduleJob(initJobDetail(quartzDataDomain), trigger);
}
// 修改job的cron
private void modifyJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzDataDomain.getCron());
TriggerKey triggerKey = TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup());
CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
String oldTime = cronTrigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(quartzDataDomain.getCron())){
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup())
.withSchedule(cronScheduleBuilder)
.build();
scheduler.rescheduleJob(triggerKey, trigger);
}
}
// 暫停job
private void pauseJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
JobKey jobKey = initJobKey(quartzDataDomain);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if(jobDetail != null){
scheduler.pauseJob(jobKey);
}
}
// 暫停所有的job
// public void pauseAllJob() throws SchedulerException {
// scheduler.pauseAll();
// }
// 重新執行job
private void resumeJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
JobKey jobKey = initJobKey(quartzDataDomain);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if(jobDetail != null){
scheduler.resumeJob(jobKey);
}
}
// 重新執行所有的job
// public void resumeAllJob() throws SchedulerException {
// scheduler.resumeAll();
// }
// 刪除job
private void deleteJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
TriggerKey triggerKey = TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup());
JobKey jobKey = initJobKey(quartzDataDomain);
Trigger trigger = scheduler.getTrigger(triggerKey);
if(trigger != null){
// 停止觸發器
scheduler.pauseTrigger(triggerKey);
// 移除觸發器
scheduler.unscheduleJob(triggerKey);
// 刪除任務
scheduler.deleteJob(jobKey);
}
}
public String checkTriggerStatus(QuartzDataDomain quartzDataDomain) throws SchedulerException {
String result;
Trigger.TriggerState triggerState = scheduler.getTriggerState(TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup()));
switch (triggerState){
case NONE:
result = "不存在";
logger.info("status: {}, quartzDataDomain: {}", "不存在", quartzDataDomain);
return result;
case ERROR:
result = "錯誤";
logger.info("status: {}, quartzDataDomain: {}", "錯誤", quartzDataDomain);
return result;
case NORMAL:
result = "正常";
logger.info("status: {}, quartzDataDomain: {}", "正常", quartzDataDomain);
return result;
case PAUSED:
result = "暫停";
logger.info("status: {}, quartzDataDomain: {}", "暫停", quartzDataDomain);
return result;
case BLOCKED:
result = "阻塞";
logger.info("status: {}, quartzDataDomain: {}", "阻塞", quartzDataDomain);
return result;
case COMPLETE:
result = "完成";
logger.info("status: {}, quartzDataDomain: {}", "完成", quartzDataDomain);
return result;
default:
result = "未知現象";
logger.info("status: {}, quartzDataDomain: {}", triggerState, quartzDataDomain);
}
return result;
}
private static JobKey initJobKey(QuartzDataDomain quartzDataDomain){
return new JobKey(quartzDataDomain.getJobName(), quartzDataDomain.getJobGroup());
}
private static JobDetail initJobDetail(QuartzDataDomain quartzDataDomain){
JobDataMap jobDataMap = new JobDataMap();
Map<String, Object> map = quartzDataDomain.getUsingJobDataMap();
if (map != null && !map.isEmpty()){
for (Map.Entry<String, Object> m: map.entrySet()) {
jobDataMap.put(m.getKey(), m.getValue());
}
return JobBuilder.newJob(PrintWordsJob.class)
.withIdentity(initJobKey(quartzDataDomain))
.usingJobData(jobDataMap)
.build();
}else {
return JobBuilder.newJob(PrintWordsJob.class)
.withIdentity(initJobKey(quartzDataDomain))
.build();
}
}
}
public class QuartzDataDomain {
private String jobName;
private String jobGroup;
private String cron;
private String triggerName;
private String triggerGroup;
private Map<String, Object> usingJobDataMap;
private String category;
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 getCron() {
return cron;
}
public void setCron(String cron) {
this.cron = cron;
}
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 Map<String, Object> getUsingJobDataMap() {
return usingJobDataMap;
}
public void setUsingJobDataMap(Map<String, Object> usingJobDataMap) {
this.usingJobDataMap = usingJobDataMap;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
@Override
public String toString() {
return "QuartzDataDomain{" +
"jobName='" + jobName + '\'' +
", jobGroup='" + jobGroup + '\'' +
", cron='" + cron + '\'' +
", triggerName='" + triggerName + '\'' +
", triggerGroup='" + triggerGroup + '\'' +
", usingJobDataMap=" + usingJobDataMap +
", category='" + category + '\'' +
'}';
}
}