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;在下一次循环中生效;