初识Quartz之Scheduler组件

quartz调度问题 没报错也没停止运行 Scheduler class: ‘org.quartz.core.QuartzScheduler‘ - running locally Scheduler class: ‘org.quartz.core.QuartzScheduler’ - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool ‘org.quartz.simpl.SimpleThreadPool’ - with 20... 阅读详情

        之前在Trigger组件中的withSchedule(ScheduleBuilder scheduleBuilder)方法中,接触过ScheduleBuilder抽象类,通过将ScheduleBuilder对象传入用于调度参数的设置。本文主要讲述的是Scheduler组件,Scheduler组件主要用于将前文讲述的Job组件中的JobDetail对象和Trigger对象绑定在一起,进行完整的调度运行。

1.SchedulerFactory

        之前JobDetail和Trigger创建对象都是使用对应的Builder类进行创建的,而Scheduler对象则稍有不同,而是使用工厂类进行创建。首先创建一个工厂类对象,即SchedulerFactory对象,其中SchedulerFactory是一个接口,里面有三个关于创建Scheduler对象的方法。

public interface SchedulerFactory {

    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     * 
     * Interface.
     * 
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */

    /**
     * <p>
     * Returns a client-usable handle to a <code>Scheduler</code>.
     * </p>
     * 
     * @throws SchedulerException
     *           if there is a problem with the underlying <code>Scheduler</code>.
     */
    Scheduler getScheduler() throws SchedulerException;

    /**
     * <p>
     * Returns a handle to the Scheduler with the given name, if it exists.
     * </p>
     */
    Scheduler getScheduler(String schedName) throws SchedulerException;

    /**
     * <p>
     * Returns handles to all known Schedulers (made by any SchedulerFactory
     * within this jvm.).
     * </p>
     */
    Collection<Scheduler> getAllSchedulers() throws SchedulerException;

}

        创建SchedulerFactory对象需要找到SchedulerFactory接口的实现类,本文讲述的实现类是StdSchedulerFactory,该类实现了接口的三个方法,因此创建完SchedulerFactory对象后,可以调用相应的方法获取Scheduler对象,如以下代码所示:

SchedulerFactory sf=new StdSchedulerFactory();
Scheduler scheduler=sf.getScheduler();
2.启动与绑定

        Scheduler也是一个接口,它有三个实现类,分别是:StdScheduler、RemoteScheduler、RemoteMBeanScheduler(抽象类,其中JBoss4RMIRemoteMBeanScheduler是抽象类的实现类)。本文以StdScheduler为例,关于scheduler对象的启动,StdScheduler有两个启动的方法,一个是即时启动,另一个是延迟启动。

public void start() throws SchedulerException {
        sched.start();
    }

    /**
     * <p>
     * Calls the equivalent method on the 'proxied' <code>QuartzScheduler</code>.
     * </p>
     */
    public void startDelayed(int seconds) throws SchedulerException {
        sched.startDelayed(seconds);
    }

        其中即时启动调用了对象名为sched的start()方法,延迟启动则是在方法内部调用了对象名为sched的startDelayed(int seconds)方法,而在StdScheduler类声明变量时,已经声明了private QuartzScheduler sched;说明sched是QuartzScheduler类型的,可以通过查看QuartzScheduler的源码,了解start()和startDelayed(int seconds)方法。

public void start() throws SchedulerException {

        if (shuttingDown|| closed) {
            throw new SchedulerException(
                    "The Scheduler cannot be restarted after shutdown() has been called.");
        }

        // QTZ-212 : calling new schedulerStarting() method on the listeners
        // right after entering start()
        notifySchedulerListenersStarting();

        if (initialStart == null) {
            initialStart = new Date();
            this.resources.getJobStore().schedulerStarted();            
            startPlugins();
        } else {
            resources.getJobStore().schedulerResumed();
        }

        schedThread.togglePause(false);

        getLog().info(
                "Scheduler " + resources.getUniqueIdentifier() + " started.");
        
        notifySchedulerListenersStarted();
    }

    public void startDelayed(final int seconds) throws SchedulerException
    {
        if (shuttingDown || closed) {
            throw new SchedulerException(
                    "The Scheduler cannot be restarted after shutdown() has been called.");
        }

        Thread t = new Thread(new Runnable() {
            public void run() {
                try { Thread.sleep(seconds * 1000L); }
                catch(InterruptedException ignore) {}
                try { start(); }
                catch(SchedulerException se) {
                    getLog().error("Unable to start secheduler after startup delay.", se);
                }
            }
        });
        t.start();
    }

        其中可以看出start()是即时启动,而start(int seconds)就是在方法里定义了一个线程,利用Thread的sleep方法进行等待实现延迟启动。



       至于绑定,调用scheduler对象的scheduleJob(JobDetail jobDetail, Trigger trigger)方法。

public Date scheduleJob(JobDetail jobDetail, Trigger trigger)
        throws SchedulerException {
        return sched.scheduleJob(jobDetail, trigger);
    }

         以下是QuartzScheduler类的scheduleJob(JobDetail jobDetail, Trigger trigger)方法,该方法对JobDetail对象和Trigger对象进行绑定。并且传入scheduler对象中。

public Date scheduleJob(JobDetail jobDetail,
            Trigger trigger) throws SchedulerException {
        validateState();

        if (jobDetail == null) {
            throw new SchedulerException("JobDetail cannot be null");
        }
        
        if (trigger == null) {
            throw new SchedulerException("Trigger cannot be null");
        }
        
        if (jobDetail.getKey() == null) {
            throw new SchedulerException("Job's key cannot be null");
        }

        if (jobDetail.getJobClass() == null) {
            throw new SchedulerException("Job's class cannot be null");
        }
        
        OperableTrigger trig = (OperableTrigger)trigger;

        if (trigger.getJobKey() == null) {
            trig.setJobKey(jobDetail.getKey());
        } else if (!trigger.getJobKey().equals(jobDetail.getKey())) {
            throw new SchedulerException(
                "Trigger does not reference given job!");
        }

        trig.validate();

        Calendar cal = null;
        if (trigger.getCalendarName() != null) {
            cal = resources.getJobStore().retrieveCalendar(trigger.getCalendarName());
        }
        Date ft = trig.computeFirstFireTime(cal);

        if (ft == null) {
            throw new SchedulerException(
                    "Based on configured schedule, the given trigger '" + trigger.getKey() + "' will never fire.");
        }

        resources.getJobStore().storeJobAndTrigger(jobDetail, trig);
        notifySchedulerListenersJobAdded(jobDetail);
        notifySchedulerThread(trigger.getNextFireTime().getTime());
        notifySchedulerListenersSchduled(trigger);

        return ft;
    }

         

         以上分析可知,首先创建一个SchedulerFactory对象,通过SchedulerFactory对象的方法构造Scheduler对象,其中Scheduler是一个抽象类,如果使用scheduler对象的start()方法启动,则需要调用QuartzScheduler类中的start()方法。然后调用QuartzScheduler类中的schduleJob()方法进行trigger和detail的绑定。


Quartz源码分析之Scheduler Scheduler是Quartz框架中的调度器,主要负责调度job的执行,监控job的状态,添加删除job等,算是Quartz框架的核心。 Scheduler由Scheduler工厂获取,这个工厂又通过Scheduler仓库来获取具体的对象。工厂的具体实现是StdSchedulerFactory类,代码逻辑如下: 构造方法:public StdSchedulerFactory() {}构造方法是 阅读详情

相关推荐

说说Quartz Scheduler任务调度框架

前言   在很多公司,特别是互联网公司,需要在指定的时间进行一些跑批任务来完成业务实现,Java中实现定时的方式有很多,其中可自己实现,也有比较成熟的框架,如: Quartz,今天来介绍一下Quartz的使用, 简述   Quartz is a richly featured, open source job scheduling library that can be inte

划不出的界限 2429

springboot启动失败解决方法

记录一下解决方法: 报错内容: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active). 解决方法: 在@SpringBootAp

qq_42911028的博客 861

Quartz(3-Scheduler)

Quartz自定义任务触发时间区间,定时任务增删改查基本方法实现,SchedulerRepository和StdSchedulerFactory详解

peng_gx的博客 840

Quartz任务调度(详细)

文章目录 一、Quartz概念 1. 基本介绍 2. Quartz运行环境 3. Quartz核心概念 4. Quartz的体系结构 二、Quart的使用 1、引入Quartz的jar包 2、入门案例 3、Job和JobDetail详解 4、JobExecutionContext 5、JobDataMap介绍 (1)使用Map获取 (2)使用 Setter 方法获取 6、有状态的Job和无状态的Job(@PersistJobDataAfterExecution) 7、Trigger (1)SimpleTri

无名指的约定 6674

冗余位技术在SAR ADC中的动态误差恢复机制解析

本文深入解析了冗余位技术在SAR ADC中的动态误差恢复机制,详细介绍了其基本概念、动态误差产生原因及冗余位的容错空间设计、时序松弛策略和数字校正算法。通过实际电路设计案例和数学建模,展示了冗余位技术如何显著提升ADC的精度和能效比,同时探讨了未来发展方向。

weixin_28335283的博客 975

基于Playwright+Pytest+Yaml+Allure的UI自动化测试框架实战指南

本文详细介绍了基于Playwright+Pytest+Yaml+Allure的UI自动化测试框架实战指南,涵盖环境搭建、核心功能实现及高级技巧。通过数据驱动测试、页面操作封装和智能等待机制,提升测试效率与可维护性。Allure报告增强功能为团队提供直观的质量反馈,助力高效UI自动化测试。

weixin_28826521的博客 488

quartz的schedulerFactory实现解析

由于需要实现一个scheduler,用于添加job,更改job等功能,但是没有调度功能。没错主要是用于监控和管理集群用的。所以需要仔细看scheduler的接口规范,于是又了这篇文章。 SchedulerFactory 是一个接口,用于Scheduler的创建和管理。接口很简单,这里主要是解析StdSchedulerFactory 的实现方式。 1、构造函数:

小飞侠的博客 1万+

【问题解析】Matlab Function的易错点(Variable Size)

Matlab Function的易错点

CrazyRabbit的博客 9869

Quartz Scheduler

SchedulerFactory & Scheduler & QuartzScheduler & QuartzSchedulerThread & ThreadExecutor(DefaultThreadExecutor) & ThreadPool(SimpleThreadPool and WorkThread)是Quartz调度任务的核心类, Schedul...

来啊 快活啊 5276

HFSS螺旋线圈的优化设计与高效仿真实践

本文详细介绍了HFSS螺旋线圈的优化设计与高效仿真实践,涵盖核心参数设置、参数化建模、仿真加速技巧及结果分析。通过HFSS软件实现螺旋线圈的高效仿真,特别适用于无线充电和RFID系统设计,提升设计效率与性能验证准确性。

weixin_30235225的博客 445

西门子博图v16安装密钥提示报错:CryptAcquireContext MS_DEF_PROV Error of containger opening...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 3306

实战Quartz的Scheduler

一 点睛 1 Scheduler是通过工厂模式创建的。 所有的Scheduler实例由SchedulerFactory来创建。 2 Quartz的三个核心概念 调度器 任务 触发器 3 Scheduler的创建方式 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler schedul...

实践求真知 9992

【大语言模型 85】IA3与其他PEFT方法对比

在大语言模型时代,参数高效微调(PEFT)技术成为了降低微调成本的关键。本文深入解析IA3(Infused Adapter by Inhibiting and Amplifying Inner Activations)方法,并与LoRA、AdaLoRA、Prefix Tuning等主流PEFT技术进行全面对比,通过理论分析、代码实现和实验验证,帮助读者理解不同PEFT方法的优劣势和适用场景,为实际项目中的技术选型提供科学依据。

熵数实验室 754

SpringBoot中使用Quartz和Scheduler

1.声明 当前的内容用于本人分析和使用定时任务:Quartz和Scheduler 2.使用SpringBoot中的Scheduler方式执行任务 1.首先需要在当前的SpringBoot的入口中开启Scheduler @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) // 这里不需要使用数据源操作 @En...

编程学习者的博客 2617

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

丨汀、的博客 512

飞牛fnNAS搭建web版微信

摘要:本文介绍了一种通过Docker在飞牛NAS上部署微信客户端的方法,实现24小时同步微信聊天记录。具体步骤包括:1)激活飞牛NAS的Docker功能并配置镜像加速源;2)创建专用文件夹并下载docker-wechat镜像;3)设置容器参数并部署微信客户端;4)通过局域网或ZeroTier内网穿透实现远程访问。相比传统Windows/Linux方案,该方法资源占用更低,适合需要长期保存微信聊天记录的用户。

dgnankai的专栏 3337

问题排查 Active Scheduler of name 'MyClusterScheduler' already registered in Quartz SchedulerRepository.

一、Error日志&原因 最近在搞Springboot整合Quartz2.3.0的时候遇到了一个诡异的问题,工程启动不起来。 错误log: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'schedulerFactoryBean' d...

Adele的专栏 3511

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Quartz之Scheduler

Scheduler的创建方式 所有的Scheduler实例应该由SchedulerFactory来创建,SchedulerFactory有两种: StdSchedulerFactory创建 SchedulerFactory sFactory=new StdSchedulerFactory(); Scheduler scheduler=sFactory.getScheduler(); ...

低调做人,高调做事 2983

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Quartz scheduler 简介

Quartz scheduler是一款优秀的Java调度器,开发人员可以很容易的将需调度的任务(task)加入调度器(scheduler)中调度运行。 如何将task加入调度器,我们首先介绍几个概念: Scheduler Task – 纯Java类,就是开发人员需要调度的任务。 Scheduler Job – 通过JobDetail获得执行任务的详细信息,定义执行方式。类似于执行模板,核

zhangzheng_427的专栏 2830

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Quartz组件介绍

Quartz是一个由java编写的开源的Job调度框架,下面对其进行一个比较详细的介绍 核心组件API介绍 调度流程分析 调度示例 核心组件API介绍SchedulerFactory /Scheduler / QuartzScheduler / SchedulerFactory是用来获取调度者scheduler的一个工厂类(scheduler并没有提供构造方法),API如下 Colle...

天涯明月 1071

Quartz学习总结之核心接口Scheduler、Job

参考文章:https://www.cnblogs.com/mengrennwpu/p/7141986.html 核心接口如下: 接口 含义 Scheduler scheduler的主要API接口 Job 任务实现接口,期望调度器能够执行 JobDetail 用于定义Job实例 Trigger 调度器基于特定时间来执行指定任务的组件 JobBui...

zengdongwen的博客 2841

浅谈Scheduler ,quartz

Scheduler工厂模式 所有的Scheduler实例应该由SchedulerFactory来创建 2.SchedulerFactory类图   最常用的是StdSchedulerFactory工程类,其出那个键Scheduler的两种方式: //3. 创建scheduler Scheduler scheduler = St...

f45056231p的博客 654

任务调度框架剖析系列 · Quartz-Scheduler

基于Java语言的作业控制开源框架,提供简单/复杂的排程时间表服务。

u012384644的专栏 1143

Quartz-scheduler 定时器概述、核心 API 与 快速入门

目录 quartz-scheduler 石英调度器概述 quartz-scheduler HelloWorld quartz-scheduler 石英调度器概述 1、Quartz 是功能强大的开源作业调度库,几乎可以集成到任何 Java 应用程序中,从最小的独立应用程序到最大的电子商务系统。Quartz 可用于创建简单或复杂的计划,以执行数以万计的工作;可以执行您编写的所有内容。 2、Q...

蚩尤后裔-汪茂雄 2万+

初识Quartz之第一个Quartz实例

转: 初识Quartz之第一个Quartz实例 2018年04月09日 17:07:31 carson0408 阅读数:366 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/carson0408/article/details/79868908 根据前面的博文对Quartz的三大组...

weixin_30680385的博客 100
上一篇: 初识Quartz之Trigger组件
下一篇: 初识Quartz之第一个Quartz实例
carson0408
博客等级 码龄9年 238粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值