SpringBoot之Quartz實戰

說明:因爲上篇文章咱們已經討論過springboot整合Quartz及相關配置,本次咱們只說明Qrtz的增、刪、改、啓動、中止相關api的使用,其中涉及的其餘技術,如:mybatisplus等技術之後進行專題討論。
閱讀本篇文章,建議您先看上一篇文章:前端

SpringBoot整合Quartz實現任務定時java

定時任務操做

參數:job的類全路徑、job所屬組、job的執行時間(cron表達式),這裏對這些參數進行封裝爲一個接收前端參數的QuartzVo,以下:git

@Data
public class QuartzVo {
    /**
     * 定時任務類全稱
     */
    private String jobClassName;
    /**
     * 定時任務所屬組
     */
    private String jobGroupName;
    /**
     * cron 表達式
     */
    private String cron;
}

編碼

  • controller 層
@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

Result類代碼

@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;
    }

}
  • serviceImpl 代碼
@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

相關文章
相關標籤/搜索