查看Quartz的定时任务

版权声明:技术总结来自互联网,书籍,以及工作积累。如果觉得我的总结有帮助,欢迎分享。 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的使用方法。

  1. 一般的,一个程序只有一个Scheduler
  2. Trigger是表示什么时候执行,一般一个任务一个单独的Trigger
  3. 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
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq1332479771/article/details/84451386