java实现定时任务

pom.xml

导入依赖配置,这里只是quartz的

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
            <version>2.5.2</version>
        </dependency>

service

package com.shengun.ssm.service;

public interface SystemSchedulerService {
    /**
     * 添加
     *
     * @param name
     * @param group
     * @param cron
     * @return
     */
    boolean addScheduler(String name, String group, String cron);

    /**
     * 修改
     *
     * @param jobDetailName
     * @param jobDetailGroup
     * @param cron
     * @return
     */
    boolean updateScheduler(String jobDetailName, String jobDetailGroup, String cron);

    /**
     * 删除
     *
     * @param jobDetailName
     * @param jobDetailGroup
     * @return
     */
    boolean deleteScheduler(String jobDetailName, String jobDetailGroup);

    /**
     * 暂停
     *
     * @param jobDetailName
     * @param jobDetailGroup
     * @return
     */
    boolean puaseScheduler(String jobDetailName, String jobDetailGroup);

    /**
     * 恢复
     *
     * @param jobDetailName
     * @param jobDetailGroup
     * @return
     */
    boolean resumeScheduler(String jobDetailName, String jobDetailGroup);
}

service实现类

package com.shengun.ssm.service.impl;

import com.shengun.ssm.job.QuartzSchedulerJob;
import com.shengun.ssm.service.SystemSchedulerService;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class SystemSchedulerServiceImpl implements SystemSchedulerService {

    @Autowired
    private Scheduler scheduler;

    @Override
    public boolean addScheduler(String name, String group, String cron) {
        try {
            JobDetail jobDetail = JobBuilder.newJob(QuartzSchedulerJob.class)//绑定一个具体工作类
                    .withIdentity(name, group) //设置一个标识,分组以及名字
                    .usingJobData("jobData", name) //传递到具体工作的数据,可以多个,获取根据dataKey获取即可
                    .usingJobData("executeData", "测试")
                    .build();
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity(name, group)//设置一个触发器标识,这里设置了跟JobDetail使用一样的命名以及分组
                    .forJob(jobDetail)//绑定trigger到jobdetail
                    .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                    .build();
            scheduler.scheduleJob(jobDetail, trigger);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public boolean updateScheduler(String jobDetailName, String jobDetailGroup, String cron) {
        try {
            JobKey jobKey = JobKey.jobKey(jobDetailName, jobDetailGroup);
            if (!CronExpression.isValidExpression(cron) || !scheduler.checkExists(jobKey)) {
                return false;
            }
            //triggerKey为添加定时任务时配置的name,group,这里是添加的时候设置的name跟group跟jobdetail是一样的
            TriggerKey triggerKey = TriggerKey.triggerKey(jobDetailName, jobDetailGroup);
            Trigger newTrigger = TriggerBuilder
                    .newTrigger()
                    .withIdentity(triggerKey)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();

//            CronTrigger newTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
//            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
//            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();

            scheduler.rescheduleJob(triggerKey, newTrigger);
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public boolean deleteScheduler(String jobDetailName, String jobDetailGroup) {
        try {
            JobKey jobKey = JobKey.jobKey(jobDetailName, jobDetailGroup);
            if (!scheduler.checkExists(jobKey)) {
                return false;
            }
            scheduler.deleteJob(jobKey);
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public boolean puaseScheduler(String jobDetailName, String jobDetailGroup) {
        try {
            JobKey jobKey = JobKey.jobKey(jobDetailName, jobDetailGroup);
            if (!scheduler.checkExists(jobKey)) {
                return false;
            }
            scheduler.pauseJob(jobKey);
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public boolean resumeScheduler(String jobDetailName, String jobDetailGroup) {
        try {
            JobKey jobKey = JobKey.jobKey(jobDetailName, jobDetailGroup);
            if (!scheduler.checkExists(jobKey)) {
                return false;
            }
            scheduler.resumeJob(jobKey);
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }
}

controller

package com.shengun.ssm.controller;

import com.shengun.annotation.OperationAnnotation;
import com.shengun.ssm.service.SystemSchedulerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SystemSchedulerController {

    @Autowired
    private SystemSchedulerService systemSchedulerService;

    @PostMapping("/add")
    @OperationAnnotation(content = "添加定时任务方法")
    public boolean add(@RequestParam String name, @RequestParam String group, @RequestParam String cron) {
        return systemSchedulerService.addScheduler(name, group, cron);
    }
    @PostMapping("/update")
    @OperationAnnotation(content = "修改定时任务方法")
    public boolean update(@RequestParam String name, @RequestParam String group, @RequestParam String cron) {
        return systemSchedulerService.updateScheduler(name, group, cron);
    }
    @PostMapping("/delete")
    @OperationAnnotation(content = "删除定时任务方法")
    public boolean delete(@RequestParam String name, @RequestParam String group) {
        return systemSchedulerService.deleteScheduler(name, group);
    }

    @PostMapping("/puase")
    @OperationAnnotation(content = "暂停定时任务方法")
    public boolean puase(@RequestParam String name, @RequestParam String group) {
        return systemSchedulerService.puaseScheduler(name, group);
    }

    @PostMapping("/resume")
    @OperationAnnotation(content = "恢复定时任务方法")
    public boolean resume(@RequestParam String name, @RequestParam String group) {
        return systemSchedulerService.resumeScheduler(name, group);
    }
}

SystemSchedulerInit配置文件

package com.shengun.ssm.config;

import com.shengun.ssm.service.SystemSchedulerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@EnableScheduling
public class SystemSchedulerInit implements ApplicationRunner {

    @Autowired
    private SystemSchedulerService systemSchedulerService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        systemSchedulerService.addScheduler("小猪佩奇", "动物组", "0/5 * * * * ?");
        systemSchedulerService.addScheduler("铁壁阿童木", "机器人组", "0/5 * * * * ?");
    }
}

QuartzSchedulerJob 定时任务

package com.shengun.ssm.job;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.time.LocalDateTime;

/**
 * 定时任务
 */
public class QuartzSchedulerJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String group = jobExecutionContext.getJobDetail().getKey().getGroup();
        switch (group) {
            case "动物组":
                System.out.println("定时任务动物组工作:" + jobExecutionContext.getJobDetail().getKey().getName()
                        + " 当前时间:" + LocalDateTime.now());
                break;
            case "机器人组":
                System.out.println("定时任务机器人组工作:" + jobExecutionContext.getJobDetail().getKey().getName()
                        + " 当前时间:" + LocalDateTime.now());
                break;
        }
    }
}


版权声明:本文为wqww_1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。