版权声明:技术总结来自互联网,书籍,以及工作积累。如果觉得我的总结有帮助,欢迎分享。 https://blog.csdn.net/qq1332479771/article/details/84451386
背景
工作中的项目有很多的定时任务,除了通过代码查看之外,没有一个页面方便的查看都有什么任务,是什么时候执行。故有此想法将所有的任务都可以同一展示到页面上。
实现
方案
考虑到我们系统中用的是Spring + Quartz2.2.1。
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
quartz本身就提供了查看、增加、删除任务的接口。所以这里主要在了解了Quartz的API后,直接用接口做的。
不过,这里的难点就是清楚Quartz的使用方法。
- 一般的,一个程序只有一个
Scheduler
Trigger
是表示什么时候执行,一般一个任务一个单独的Trigger
Job
是任务具体执行什么代码,一般一个Job也是绑定单独的Trigger
其中,这里要单独说一下的就是group
的概念,它就是字面意思分组,在创建的时候可以不填,默认都是Default
Quartz参考教程:https://www.w3cschool.cn/quartz_doc/
代码
有了上面的基本概念,直接参考代码
@Controller
@RequestMapping("/quartz")
public class ManageQuartzJobs {
@Autowired
private SchedulerFactoryBean springScheduler;
@RequestMapping("/get_all_jobs")
public List<QuartzJobsVO> getAllJobs() {
List<QuartzJobsVO> quartzJobsVOList = new ArrayList<>();
try {
//获取Scheduler
Scheduler scheduler = springScheduler.getScheduler();
//再获取Scheduler下的所有group
List<String> triggerGroupNames = scheduler.getTriggerGroupNames();
for (String groupName : triggerGroupNames) {
//组装group的匹配,为了模糊获取所有的triggerKey或者jobKey
GroupMatcher groupMatcher = GroupMatcher.groupEquals(groupName);
//获取所有的triggerKey
Set<TriggerKey> triggerKeySet = scheduler.getTriggerKeys(groupMatcher);
for (TriggerKey triggerKey : triggerKeySet) {
//通过triggerKey在scheduler中获取trigger对象
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
//获取trigger拥有的Job
JobKey jobKey = trigger.getJobKey();
JobDetailImpl jobDetail = (JobDetailImpl) scheduler.getJobDetail(jobKey);
//组装页面需要显示的数据
QuartzJobsVO quartzJobsVO = new QuartzJobsVO();
quartzJobsVO.setGroupName(groupName);
quartzJobsVO.setJobDetailName(jobDetail.getName());
quartzJobsVO.setJobCronExpression(trigger.getCronExpression());
quartzJobsVO.setTimeZone(trigger.getTimeZone().getID());
quartzJobsVOList.add(quartzJobsVO);
}
}
} catch (Exception e) {
log.error("获取定时任务信息出错", e);
}
return quartzJobsVOList;
}
}
其中,QuartzJobsVO
类是我自定义用于展示到页面上的类。
public class QuartzJobsVO {
private String jobDetailName;
private String jobCronExpression;
private String timeZone;
private String groupName;
}
参考页面
其中,查看最近运行时间的代码见:https://blog.csdn.net/qq1332479771/article/details/84348001