调度介绍 - Quartz

简介: 众所周知,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实时生图绘板
相关文章
|
前端开发 JavaScript Java
现代化软件开发中的前后端分离模式
随着互联网技术的快速发展,现代化软件开发中的前后端分离模式逐渐成为主流。本文将介绍前后端分离的概念和优势,以及如何在不同的技术栈中实现这种模式。通过前后端分离,可以提高开发效率、降低耦合性,并且更好地满足用户需求。
1372 0
|
Python 数据挖掘 自然语言处理
Python---qq群聊天记录词云分析
python拥有近13w个第三方库,其中有很多优秀的库,比如wordcloud,scipy,jieba等库,能快速实现很多功能,比如制作一个QQ群聊天记录词云…… 工具:PyCharm, Python3.6.5 1.获取数据源 qq左下角 导出消息记录 要用.txt导出到任意盘符,接下来就要对导出的txt文件进行数据分析。
3193 0
|
2月前
|
人工智能 自然语言处理 机器人
AI Agent 工程实践:从大语言模型到自主任务执行系统的架构演进
AI Agent 是让大模型从“能聊”走向“能干”的关键架构:它融合感知、规划、工具调用、记忆与反馈,构建可执行复杂任务的智能系统。不同于聊天机器人,Agent 能自主拆解目标、调用API、跨步执行并持续优化,正成为企业智能化的新基建。
530 3
|
1月前
|
缓存 人工智能 自然语言处理
AI Agent上下文工程:从提示词优化到上下文压缩的全链路实践
AI Agent的瓶颈正从“模型能力”转向“上下文能力”。长上下文≠高效上下文,关键在于有限Token预算下,精准筛选、分层管理、动态压缩、结构化装配最有价值的信息。上下文工程(Context Engineering)是构建可靠企业级Agent的核心基础设施。
204 0
|
3月前
|
监控 安全 前端开发
构建坚不可摧的防线:全方位保障 API 接口数据安全
本文系统拆解企业级API安全防护体系,涵盖鉴权、传输加密、防篡改、防重放、限流熔断、参数校验、日志监控与合规风控八大维度,提供JWT/OAuth2/HMAC等实战方案,强调HTTPS为底线、签名+幂等为关键、监控巡检为长效保障,助力开发者构建稳定、安全、可追溯的生产级接口防线。
532 0
|
5月前
|
缓存 人工智能 网络协议
2026年域名根服务器技术教程
本文参考:http://dwscf.cn系统介绍域名根服务器的基本概念、全球13台根服务器的当前架构(含ICANN管理及2026年新改进),详解BIND配置部署、性能优化与安全加固(TLS、DNSSEC等),并提供响应慢、配置错误、DDoS攻击等常见问题解决方案,最后展望分布式DNS、AI应用与国际化域名等进阶方向。(239字)
|
9月前
|
人工智能 搜索推荐 自动驾驶
FPGA 的回归:AI 时代,算力终于开始“量体裁衣”了
FPGA 的回归:AI 时代,算力终于开始“量体裁衣”了
606 0
|
消息中间件 SQL 存储
RocketMQ Flink Catalog 设计与实践
RocketMQ Flink Catalog 使用指南
RocketMQ Flink Catalog 设计与实践