說明:因爲上篇文章咱們已經討論過springboot整合Quartz及相關配置,本次咱們只說明Qrtz的增、刪、改、啓動、中止相關api的使用,其中涉及的其餘技術,如:mybatisplus等技術之後進行專題討論。
閱讀本篇文章,建議您先看上一篇文章:前端
參數:job的類全路徑、job所屬組、job的執行時間(cron表達式),這裏對這些參數進行封裝爲一個接收前端參數的QuartzVo,以下:git
@Data public class QuartzVo { /** * 定時任務類全稱 */ private String jobClassName; /** * 定時任務所屬組 */ private String jobGroupName; /** * cron 表達式 */ private String cron; }
@Controller public class JobController extends BaseController { @Autowired JobService jobService; @Autowired QrtzJobDetailsService qrtzJobDetailsService; @RequestMapping({"", "/"}) public String index() { return "/view/index"; } @GetMapping("/query/jobs") @ResponseBody public Result query() { List<QrtzJobDetails> list = qrtzJobDetailsService.list(new QueryWrapper<QrtzJobDetails>() .eq("SCHED_NAME", "clusteredScheduler") ); return Result.success(list); } @PostMapping("/job/add") @ResponseBody public Result addJob(@RequestBody QuartzVo quartzVo) throws Exception { Result result = jobService.addJob(quartzVo.getJobClassName(), quartzVo.getJobGroupName(), quartzVo.getCron()); return result; } @PostMapping("/job/delete") @ResponseBody public Result deleteJob(@RequestBody QuartzVo quartzVo) throws SchedulerException { Result result = jobService.deleteJob(quartzVo.getJobClassName(), quartzVo.getJobGroupName()); return result; } @PostMapping("/job/update") @ResponseBody public Result updateJob(@RequestBody QuartzVo quartzVo) throws SchedulerException { Result result = jobService.updateJob(quartzVo.getJobClassName(), quartzVo.getJobGroupName(), quartzVo.getCron()); return result; } @PostMapping("/job/start") @ResponseBody public Result startJob(@RequestBody QuartzVo quartzVo) throws SchedulerException { Result result = jobService.startJob(quartzVo.getJobClassName(), quartzVo.getJobGroupName()); return result; } @PostMapping("job/stop") @ResponseBody public Result stopJob(@RequestBody QuartzVo quartzVo) throws SchedulerException { Result result = jobService.stopJob(quartzVo.getJobClassName(), quartzVo.getJobGroupName()); return result; } }
說明:controller層提供了一個查詢定時任務的方法,其中用到的是mybatisplus的方法,後續咱們專門出一個專題來聊這個技術。再往下就是定時任務的增、刪、改、啓動、暫停。幾乎每個方法都寫了詳細的註釋你們直接看代碼就行能夠。github
Result是咱們統一返回給前端的數據封裝,方便前端同窗統一獲取數據。spring
@Data public class Result implements Serializable { // 0成功,-1失敗 private int status; private String msg; private Object data; public static Result success() { return Result.success("操做成功", null); } public static Result success(Object data) { return Result.success("操做成功", data); } public static Result success(String msg, Object data) { Result result = new Result(); result.status = 0; result.msg = msg; result.data = data; return result; } public static Result fail(String msg) { Result result = new Result(); result.status = -1; result.data = null; result.msg = msg; return result; } }
@Service public class JobServiceImpl implements JobService { @Autowired Scheduler scheduler; /** * 新增job任務 * * @param jobName job名稱 * @param jobGroupName job分組名稱 * @param cron cron 表達式 * @throws SchedulerException */ public Result addJob(String jobName, String jobGroupName, String cron) throws Exception { //構建job信息 JobDetail jobDetail = JobBuilder.newJob(getClass(jobName).getClass()).withIdentity(jobName, jobGroupName).build(); //cron表達式調度器構建 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); //構建 Trigger CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName).withSchedule(scheduleBuilder).build(); Date date = scheduler.scheduleJob(jobDetail, cronTrigger); if (date==null){ return Result.fail("添加定時任務失敗"); } return Result.success(); } /** * 刪除定時任務 * * @param jobName 任務名稱 * @param jobGroup 任務分組 * @throws SchedulerException */ public Result deleteJob(String jobName, String jobGroup) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); scheduler.pauseTrigger(triggerKey); scheduler.unscheduleJob(triggerKey); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); boolean deleteJob = scheduler.deleteJob(jobKey); if (deleteJob){ return Result.fail("刪除定時任務失敗"); } return Result.success(); } /** * 修改定時任務 * * @param jobName job名稱 * @param jobGroupName job分組名稱 * @param cron cron 表達式 */ public Result updateJob(String jobName, String jobGroupName, String cron) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); //從新構建表達式trigger trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); Date date = scheduler.rescheduleJob(triggerKey, trigger); if (date==null){ return Result.fail("添加定時任務失敗"); } return Result.success(); } /** * 啓動定時任務 * @param jobClassName 任務名稱 * @param jobGroupName 任務所屬組 * @return * @throws SchedulerException */ @Override public Result startJob(String jobClassName, String jobGroupName) throws SchedulerException { scheduler.resumeJob(JobKey.jobKey(jobClassName,jobGroupName)); return Result.success(); } /** * 中止定時任務 * @param jobClassName 任務名稱 * @param jobGroupName 任務所屬組 * @return * @throws SchedulerException */ @Override public Result stopJob(String jobClassName, String jobGroupName) throws SchedulerException { scheduler.pauseJob(JobKey.jobKey(jobClassName,jobGroupName)); return Result.success(); } private BaseJob getClass(String jobName) throws Exception { Class<?> class1 = Class.forName(jobName); return (BaseJob) class1.newInstance(); } }
說明:增長定時任務,首先咱們須要開發一個你的業務定時任務,在這裏咱們進行查詢數據庫中如今處在的定時任務。數據庫
咱們建立一個基礎定時任務接口類BaseJob
繼承Job
實現方法execute
,代碼以下:api
public interface BaseJob extends Job { @Override void execute(JobExecutionContext context) throws JobExecutionException; }
@Component @Slf4j public class MyJob implements BaseJob { @Autowired QrtzJobDetailsService qrtzJobDetailsService; @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("定時任務以啓動"); List<QrtzJobDetails> list = qrtzJobDetailsService.list(new QueryWrapper<QrtzJobDetails>() .eq("SCHED_NAME", "clusteredScheduler") ); System.out.println(list); System.out.println("定時任務執行時間"+new Date()); } }
說明:其中的方法就是進行查詢數據庫庫中如今存在的定時任務,並輸出到控制檯。springboot
咱們用postman進行接口測試。
mybatis
顯示操做成功,因爲添加完成定時任務後,定時任務就會啓動,咱們來看控制檯
app
定時任務在開始執行,而且查詢出來了咱們剛添加的定時任務信息。
因爲我設置的是一分鐘執行一次,接下來咱們測試暫停定時任務;
仍是利用postman進行測試
定時任務已經暫停:
下面的其餘方法就不一一進行測試了,感興趣的銅須能夠本身測試一下。相關代碼已經上傳到本人的github
地址:https://github.com/triumphxx/spring-boot-quartz.git