在上一篇中把基本的动态定时任务使用讲了一下,接下来就来实现一个动态任务平台,它长这样:
这个页面虽然不是很复杂,但是基本功能都健全,包括任务的CRUD,这是最基本的,然后有一个状态栏显示任务的运行状态,同时提供任务的启动与暂停操作按钮,可以说能否符合一般需求。
页面使用SpringBoot官方钦定的thymeleaf,但是没有使用到任何thymeleaf模板方面的东西(模板这玩意我不熟+_+),同时使用了css样式框架bootstrap和js框架jQuery。
后台方面,框架使用SpringBoot,持久化使用JPA(很方便)。
由于整个项目代码量比较多,不能够全部贴上来,因此只贴一个任务管理核心的文件,其他的我放到github上。
github地址:点击进入
关键代码:
package com.example.demo.utils;
import com.example.demo.entity.ScheduleJob;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @Author:kkorkk.
* @Date:2018/10/15 14:24
* @Description:定时任务工具类
*/
@Component
public class ScheduleUtils {
@Autowired
Scheduler scheduler;
/**
* @author: kkorkk
* @description: 启动/恢复任务
* @date 2018/10/18 9:18
* @param scheduleJob
* @return
* */
public void addJob(ScheduleJob scheduleJob) {
//如果之前存在任务,则恢复,否则新增任务
JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());
try {
if(scheduler.checkExists(jobKey)){
scheduler.resumeJob(jobKey);
}else {
try {
Class jobClass = Class.forName(scheduleJob.getClassName());
JobDetail jobDetail = JobBuilder.newJob(jobClass)
.withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup())
.build();
//定义调度触发规则
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup())
.withSchedule(CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()))
.startNow()
.build();
//把作业和触发规则注册到任务调度中
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* @author: kkorkk
* @description: 停止任务
* @date 2018/10/18 9:15
* @param scheduleJob
* @return
* */
public void pauseJob(ScheduleJob scheduleJob){
JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());
try {
scheduler.pauseJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* @author: kkorkk
* @description: 恢复任务
* @date 2018/10/18 9:14
* @param scheduleJob
* @return
* */
public void resumeJob(ScheduleJob scheduleJob){
JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());
try {
scheduler.resumeJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* @author: kkorkk
* @description: 更新cron表达式
* @date 2018/10/18 14:40
* @param scheduleJob
* @return
* */
public void updateCronExpression(ScheduleJob scheduleJob){
//获取TriggerKey
TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());
try {
//创建触发规则
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerKey)
.withSchedule(scheduleBuilder)
.startNow()
.build();
scheduler.rescheduleJob(triggerKey,trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}