调度介绍 - Quartz

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 众所周知,Quartz作为知名的企业级调度框架,提供了丰富的特性。本文通过一个简单的示例,介绍下quartz在springboot的应用和quartz部分基本概念,并展示了quartz调度作业的基本过程。

1.先看效果

image.png
通过上图打印日志信息,我们可以知道,作业会经历一个这样的生命周期:触发器触发 -> 作业即将被执行 -> 作业被执行 -> 作业执行完成 -> 本次调度触发完成。

2.看项目结构

image.png

3.看关键类

3.1 StartRunner

StartRunner实现了ApplicationRunner,会随着Springboot启动被执行。该类主要作用是启动Quartz并读取配置文件中作业相关配置信息,将作业加入调度计划。

  • 配置项:
system.job.classNameList=com.example.little.job.BusinessJob
system.job.cronList=0/30 ?
  • StartRunner,注入了QzService
public class StartRunner implements ApplicationRunner {

    @Autowired
    private QzService qzService;

    @Autowired
    private JobInfoConfig jobInfoConfig;

    @Override
    public void run(ApplicationArguments args) throws Exception {

        qzService.start();
        log.info("我的日志: qz调度启动.");
        String[] jobList = jobInfoConfig.getClassNameList();
        String[] cronList = jobInfoConfig.getCronList();
        for (int i = 0; i < jobList.length; i++) {
            JobInfo jobInfo = new JobInfo();
            jobInfo.setClassName(jobList[i].trim());
            jobInfo.setCron(cronList[i].trim());
            qzService.addJob(jobInfo);
        }
    }
}

3.2 QzService

具体实现类是QuartzServiceImpl,封装了Quartz的调度器Scheduler常用功能。示例中的调度启动start()方法,在启动时加入了各种类型的Listener;作业加入调度的addJob(),可将作业加入调度。当然Quartz还支持作业暂定、移除、恢复调度等很多的功能。此处仅做演示,代码如下:

@Service
public class QzServiceImpl implements QzService {

    @Autowired
    Scheduler scheduler;

    @Override
    public void start() throws Exception {
        scheduler.getListenerManager().addJobListener(new JobListener());
        scheduler.getListenerManager().addTriggerListener(new TriggerListener());
        scheduler.getListenerManager().addSchedulerListener(new SchedulerListener());
        scheduler.start();
    }

    @Override
    public void addJob(JobInfo jobInfo) throws Exception {
        Class clazz_ = Class.forName(jobInfo.getClassName());
        JobDetail jobDetail = JobBuilder.newJob(clazz_).build();
        Trigger trigger = TriggerBuilder.newTrigger().
                withSchedule(CronScheduleBuilder.cronSchedule(jobInfo.getCron())).build();
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

3.3 SchedulerListener

见名知意,是调度相关事件的监听器,这里仅实现了两个方法,作业加入调度时会通知jobAdd()方法,scheduler将job和trigger绑定的时候会通知jobScheduled()方法。代码如下:

@Slf4j
public class SchedulerListener extends SchedulerListenerSupport {

    @Override
    public void jobAdded(JobDetail jobDetail) {
        super.jobAdded(jobDetail);
        log.info("我的日志: job被加入调度 ,key {}", jobDetail.getKey());
    }

    @Override
    public void jobScheduled(Trigger trigger) {
        super.jobScheduled(trigger);
        log.info("我的日志:作业开始被调度 ,key {}", trigger.getKey());
    }
}

3.4.TriggerListener

trigger事件监听器,当trigger到达执行时间被触发时,会通知triggerFired()方法;当触发完成后,会通知triggerComplete()方法;当trigger错过调度时间时,会通知triggerMisfired()方法。

public class TriggerListener extends TriggerListenerSupport {
    @Override
    public String getName() {
        return "little_trigger";
    }

    @Override
    public void triggerFired(Trigger trigger, JobExecutionContext context) {
        super.triggerFired(trigger, context);
        log.info("我的日志: trigger触发开始 {}", trigger.getKey());
    }

    @Override
    public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) {
        super.triggerComplete(trigger, context, triggerInstructionCode);
        log.info("我的日志:trigger触发结束  {}  ", trigger.getKey());
    }

    @Override
    public void triggerMisfired(Trigger trigger) {
        super.triggerMisfired(trigger);
        log.info("我的日志,trigger错过触发 {} ", trigger.getKey());
    }
}

3.5 JobListener

job的事件监听器,作业将要被执行时,会通知jobToBeExecuted()方法;作业执行完成时,会通知jobWasExecuted()方法。想一下,这里是不是可以在作业执行的前后做些什么?比如日志、执行情况记录等等。

public class JobListener extends JobListenerSupport {
    @Override
    public String getName() {
        return "little_job";
    }

    @Override
    public void jobToBeExecuted(JobExecutionContext context) {
        super.jobToBeExecuted(context);
        log.info("我的日志: job将要被执行");
    }

    @Override
    public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
        super.jobWasExecuted(context, jobException);
        log.info("我的日志:job执行完成");
    }
}

相关概念

  • Scheduler:Quartz的核心调度器,提供了调度器启动、终止、作业新增、暂定、移除、恢复调度等丰富的功能。
  • Job(QuartzJobBean):QuartzJobBean是Spring对quartz的Job的包装,只有一个方法,用于实现真正要被调度的业务逻辑。
  • Trigger:触发器,时间到达执行时间时会被触发,去触发Job的执行。
  • 各类监听器:标准的观察者模式,可根据业务需要进行扩展,对于作业的全生命周期进行监控或者控制,比如本示例的日志打印。作业监听器JobListenerSupport,调度监听器SchedulerListenerSupport,触发器监听TriggerListenerSupport。

其他

1.示例中,通过配置文件+ApplicationRunner的方式来将作业加入quartz执行,可改为读取数据库方式,实现更加灵活的作业管控。
2.示例中,各类监听器,监听到事件时仅仅做了日志打印动作,实际可根据业务需要进行一些记录或者作业执行过程中的管控。

参考

1.官网,quartz官方文档。
2.示例,一个简单的示例,介绍了许多常用的API。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
3月前
|
数据采集 存储 Web App开发
Python爬虫技巧:设置Cookie永不超时的详细指南
Python爬虫技巧:设置Cookie永不超时的详细指南
|
2月前
|
机器学习/深度学习 自然语言处理 搜索推荐
搜索结果太乱?5种重排序模型让你的搜索系统准确率提升40%
本文将系统性地分析重排序模型的技术原理,深入探讨从传统学习排序方法到基于Transformer架构的前沿解决方案。
337 0
搜索结果太乱?5种重排序模型让你的搜索系统准确率提升40%
|
5月前
|
自然语言处理 并行计算 C++
FlashTokenizer: 基于C++的高性能分词引擎,速度可以提升8-15倍
FlashTokenizer是一款高性能CPU分词引擎,专为BERT等Transformer架构优化。基于高效C++实现与多线程并行处理,性能较传统分词器提升8-15倍,显著加速文本预处理。支持跨平台安装,适用于大规模文本处理、实时NLP应用及资源受限场景,助力开发者提升模型推理效率、降低硬件成本。
168 13
FlashTokenizer: 基于C++的高性能分词引擎,速度可以提升8-15倍
|
2月前
|
分布式计算 Serverless OLAP
实时数仓Hologres V3.1版本发布,Serverless型实例从零开始构建OLAP系统
Hologres推出Serverless型实例,支持按需计费、无需独享资源,适合新业务探索分析。高性能查询内表及MaxCompute/OSS外表,弹性扩展至512CU,性能媲美主流开源产品。新增Dynamic Table升级、直读架构优化及ChatBI解决方案,助力高效数据分析。
实时数仓Hologres V3.1版本发布,Serverless型实例从零开始构建OLAP系统
|
3月前
|
前端开发 Java 数据库
2025 版大学四年学好 Java 并成功拿到 offer 的技术选型与环境搭建全攻略
这篇指南为大一新生提供了系统化的Java学习路线,涵盖环境搭建、核心技术实战与项目经验。首先推荐使用IntelliJ IDEA和OpenJDK 21,掌握函数式编程、异常处理及虚拟线程等关键技能。其次通过图书馆管理系统项目实践MVC架构,结合Spring Boot与H2数据库巩固知识。规划建议从基础语法到集合框架逐步深入,并参与开源项目提升能力。配套在线课程与技术社区资源助力高效学习,助你在大学四年打下坚实基础,顺利拿到offer。
97 0
|
8月前
|
缓存 负载均衡 安全
Swift中的网络代理设置与数据传输
Swift中的网络代理设置与数据传输
|
5月前
|
人工智能 JSON 安全
API 即 MCP|Higress 发布 MCP Marketplace,加速存量 API 跨入 MCP 时代
Higress 发布 MCP Marketplace,加速存量 API 跨入 MCP 时代。
|
机器学习/深度学习 人工智能 自然语言处理
Transformer 能代替图神经网络吗?
Transformer模型的革新性在于其自注意力机制,广泛应用于多种任务,包括非原始设计领域。近期研究专注于Transformer的推理能力,特别是在图神经网络(GNN)上下文中。
409 5
|
机器学习/深度学习 人工智能 算法
深入分析自动化测试中AI驱动的测试用例生成技术
【4月更文挑战第29天】随着人工智能技术的不断发展,其在软件测试领域的应用也越来越广泛。本文主要探讨了AI驱动的测试用例生成技术在自动化测试中的应用,以及其对提高测试效率和质量的影响。通过对现有技术的深入分析和实例演示,我们展示了AI如何通过学习和理解软件行为来自动生成有效的测试用例,从而减少人工编写测试用例的工作量,提高测试覆盖率,降低错误检测的成本。
|
调度
FreeRTOS深入教程(空闲任务和Tick中断深入分析)
FreeRTOS深入教程(空闲任务和Tick中断深入分析)
646 0