在springboot工程中修改使用quartz创建的定时任务

101 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

Quratz是什么:

Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。 Quartz 可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。 Quartz 允许程序开发人员根据时间的间隔来调度作业。 Quartz 实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。

创建springboot工程集成Quratz:

在IDEA中基于springboot 2.7.*创建工程,集成Quratz,勾选I/O下Quratz Scheduler即可; 在这里插入图片描述 创建完成后的pom.xml中Quratz的依赖是

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

因为需要编写接口服务,所以引入了spring-boot-starter-web依赖;

获取所有Job信息;

  • 编写restful接口;

创建接口添加注解RestController和RequestMapping

@RestController
@RequestMapping("/api/cron")
public class CronRS {

    @Autowired
    Scheduler scheduler;

   
    @GetMapping("/list")
    public List<Map<String,Object>> listCron() throws Throwable{

        GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
        Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
        List<Map<String,Object>> list = new ArrayList<>();
        for (JobKey jobkey: jobKeys) {
            List<? extends Trigger> triggers =scheduler.getTriggersOfJob(jobkey);
            for (Trigger trigger:triggers) {
                Map<String,Object> map = new HashMap<>();
                map.put("jobName",jobkey.getName());
                map.put("jobGroup",jobkey.getGroup());
                TriggerKey triggerKey = trigger.getKey();
                map.put("triggerKey",triggerKey.getName());
                Trigger.TriggerState state = scheduler.getTriggerState(triggerKey);
                map.put("state",state.name());
                if (trigger instanceof CronTrigger) {
                    CronTrigger cronTrigger = (CronTrigger) trigger;
                    String cronExpression = cronTrigger.getCronExpression();
                    map.put("cron",cronExpression);
                }
                list.add(map);
            }
        }

        return list;
    }

修改指定的Job定时任务触发信息;

需要传入指定的TriggerKey,才能确定需要修改的触发器;

 @GetMapping("/update")
    public String updateCron() throws Throwable{

        TriggerKey triggerKey = new TriggerKey("pushJobTrigger");
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
                .cronSchedule("0/10 * * * * ?");
        Trigger trigger = TriggerBuilder.newTrigger()
                .usingJobData("type","studio-restart")
                .withIdentity(triggerKey)
                .withSchedule(scheduleBuilder)
                .build();

        scheduler.rescheduleJob(triggerKey,trigger);

        return "ok";
    }
实现逻辑:

在以上代码中,接口服务中的Scheduler是可以直接依赖注入的;不需要额外指定Bean;但在之前版本的Quratz中是需要的;

  • 获取所有job的逻辑是:

使用GroupMatcher匹配获取所有的jobKey;主要使用scheduler.getJobKeys()方法获取

使用jonbkey获取对应的触发器trigger;

获取所有触发器的相关信息;

  • 修改逻辑

根据TriggerKey重新设置CronScheduleBuilder;在下一次循环中生效;