package cn.timer.api.controller.quartz; import java.util.HashMap; import java.util.Map; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.github.pagehelper.PageInfo; import cn.timer.api.bean.quartz.JobAndTrigger; import cn.timer.api.config.quartz.BaseJob; import cn.timer.api.dao.quartz.JobAndTriggerMapper; import cn.timer.api.utils.Result; import cn.timer.api.utils.ResultUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @Api(tags = "99.0 Quartz") @RestController @RequestMapping(value = "/quartz", produces = { "application/json" }) public class JobController { @Autowired private JobAndTriggerMapper jobAndTriggerMapper; // 加入Qulifier注解,通过名称注入bean @Autowired // @Qualifier("Scheduler") private Scheduler scheduler; @SuppressWarnings("unused") private static Logger log = LoggerFactory.getLogger(JobController.class); @PostMapping(value = "/addjob") @ApiOperation(value = "新增任务", httpMethod = "POST", notes = "接口发布说明") public Result<Void> addjob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName, @RequestParam(value = "cronExpression") String cronExpression) throws Exception { addJob(jobClassName, jobGroupName, cronExpression); return ResultUtil.success("新增定时任务成功"); } public void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception { // 启动调度器 scheduler.start(); // 构建job信息 JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass()) .withIdentity(jobClassName, jobGroupName).build(); // 表达式调度构建器(即任务执行的时间) CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); // 按新的cronExpression表达式构建一个新的trigger CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName) .withSchedule(scheduleBuilder).build(); try { scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException e) { System.out.println("创建定时任务失败" + e); throw new Exception("创建定时任务失败"); } } @PostMapping(value = "/pausejob") @ApiOperation(value = "暂停任务", httpMethod = "POST", notes = "接口发布说明") public Result<Void> pausejob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName) throws Exception { jobPause(jobClassName, jobGroupName); return ResultUtil.success("暂停定时任务成功"); } public void jobPause(String jobClassName, String jobGroupName) throws Exception { scheduler.pauseJob(JobKey.jobKey(jobClassName, jobGroupName)); } @PostMapping(value = "/resumejob") @ApiOperation(value = "恢复任务", httpMethod = "POST", notes = "接口发布说明") public Result<Void> resumejob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName) throws Exception { jobresume(jobClassName, jobGroupName); return ResultUtil.success("恢复定时任务成功"); } public void jobresume(String jobClassName, String jobGroupName) throws Exception { scheduler.resumeJob(JobKey.jobKey(jobClassName, jobGroupName)); } @PostMapping(value = "/reschedulejob") @ApiOperation(value = "重新设置任务", httpMethod = "POST", notes = "接口发布说明") public Result<Void> rescheduleJob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName, @RequestParam(value = "cronExpression") String cronExpression) throws Exception { jobreschedule(jobClassName, jobGroupName, cronExpression); return ResultUtil.success("重设定时任务成功"); } public void jobreschedule(String jobClassName, String jobGroupName, String cronExpression) throws Exception { try { TriggerKey triggerKey = TriggerKey.triggerKey(jobClassName, jobGroupName); // 表达式调度构建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); // 按新的cronExpression表达式重新构建trigger trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); // 按新的trigger重新设置job执行 scheduler.rescheduleJob(triggerKey, trigger); } catch (SchedulerException e) { System.out.println("更新定时任务失败" + e); throw new Exception("更新定时任务失败"); } } @PostMapping(value = "/deletejob") @ApiOperation(value = "删除任务", httpMethod = "POST", notes = "接口发布说明") public Result<Void> deletejob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName) throws Exception { jobdelete(jobClassName, jobGroupName); return ResultUtil.success("删除成功"); } public void jobdelete(String jobClassName, String jobGroupName) throws Exception { scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName)); scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName)); scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName)); } @GetMapping(value = "/queryjob") @ApiOperation(value = "查询任务", httpMethod = "GET", notes = "接口发布说明") public Result<Map<String, Object>> queryjob(@RequestParam(value = "pageNum") Integer pageNum, @RequestParam(value = "pageSize") Integer pageSize) { PageInfo<JobAndTrigger> jobAndTrigger = jobAndTriggerMapper.getJobAndTriggerDetails(pageNum, pageSize); Map<String, Object> map = new HashMap<String, Object>(); map.put("JobAndTrigger", jobAndTrigger); map.put("number", jobAndTrigger.getTotal()); return ResultUtil.data(map, "查询成功"); } public static BaseJob getClass(String classname) throws Exception { Class<?> class1 = Class.forName(classname); return (BaseJob) class1.newInstance(); } }