首页 > 其他分享 >分布式任务调度(00)--Quartz

分布式任务调度(00)--Quartz

时间:2023-11-07 16:11:25浏览次数:35  
标签:触发器 Quartz scheduler -- 任务 Trigger Scheduler 任务调度

1 任务调度整体流程

2 组件

  • 调度器 :工厂类创建Scheduler,根据触发器定义的时间规则调度任务
  • 任务:Job表示被调度的任务
  • 触发器:Trigger 定义调度时间的元素,按啥时间规则执行任务。一个Job可被多个Trigger关联,但是一个Trigger 只能关联一个Job
import org.quartz.*;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzDemo {
    public static void main(String[] args) throws SchedulerException {
        // 创建JobDetail对象
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .withIdentity("myJob", "group1")
                .build();

        // 创建Trigger对象
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();

        // 创建Scheduler对象
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();

        // 将Job和Trigger注册到Scheduler
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

执行任务调度核心类QuartzSchedulerThread:

  1. 调度线程从JobStore中获取需要执行的的触发器列表,并修改触发器的状态
  2. Fire触发器,修改触发器信息(下次执行触发器的时间,以及触发器状态),并存储
  3. 最后创建具体的执行任务对象,通过worker线程池执行任务

3 集群部署方案

没有负责集中管理的节点,而是利用数据库行级锁实现并发控制。

scheduler实例在集群模式先获取{0}LOCKS表中的行锁,MySQL获取行锁:

  • {0}会替换为配置文件默认配置的QRTZ_
  • sched_name为应用集群的实例名
  • lock_name就是行级锁名

1.3 Quartz的行级锁

  • 触发器访问锁 (TRIGGER_ACCESS)
  • 状态访问锁(STATE_ACCESS)

解决了任务的分布式调度问题,同一个任务只能有一个节点运行,其他节点将不执行任务,当碰到大量短任务时,各节点频繁的竞争数据库锁,节点越多性能越差。

本文由博客一文多发平台 OpenWrite 发布!

标签:触发器,Quartz,scheduler,--,任务,Trigger,Scheduler,任务调度
From: https://www.cnblogs.com/JavaEdge/p/17815242.html

相关文章

  • maven添加本地jar包
     (base)P:\Maven\bin>(base)P:\Maven\bin>(base)P:\Maven\bin>mvninstall:install-file-Dfile=P:\ifc_tools\ifc-sdk3-java-1.0.0.jar-DgroupId=modular.openapi-DartifactId=ifc-sdk3-Dversion=java-1.0.0-Dpackaging=jar[INFO]Scanningforp......
  • 软件开发项目文档系列之八数据库设计说明书
    数据库设计说明书是一个关键文档,它提供了有关数据库的详细信息,包括设计、结构、运行环境、数据安全、管理和维护等方面的内容。1引言引言部分,简要介绍数据库设计说明书的目的和内容。这部分通常包括以下内容:引言的目的:解释为什么需要数据库设计说明书,它的重要性以及它对项目的......
  • Java基础
    Java基础语法1.注释注释不会执行,给写代码的人看三种注释:单行注释://多行注释:/**/文档注释:/***/publicclassHelloworld{publicstaticvoidmain(String[]args){//单行注释//控制台输出一个Hello,worldSystem.out.println("Hello,......
  • python 播放语音使用 playsound -注意事项
    https://github.com/TaylorSMarks/playsoundpipinstallplaysound>>>fromplaysoundimportplaysound>>>playsound('/path/to/a/sound/file/you/want/to/play.mp3')try:playsound("test.wav")exceptExceptionase:p......
  • PySpark判断Hdfs文件路径是否存在
    背景从ScalaSpark代码转PySpark代码,同时实现连续读多个文件,避免因某些路径不存在导致程序终止。在Scala的Spark中可以直接导下面两个模块的包importorg.apache.hadoop.conf.Configurationimportorg.apache.hadoop.fs._然后调用方法就可以实现对hdfs的文件判断了valfs=......
  • postgis导入shp数据指空间坐标系的方法
    转自:https://www.jianshu.com/p/2e3f31b9b9031、通过postgis导入界面进行设置 2、通过sql语句进行设置SELECTUpdateGeometrySRID('表名','geom',4326);执行成功后可在geometrycolomns里这个表的srid列变为4326 ......
  • cf1856E2. PermuTree (hard version)(bitset+二进制优化背包+开不同大小bitset)
    https://codeforces.com/contest/1856/problem/E2结论是显然的,关键是有一些科技在里面bitset+二进制优化具体分析可以参考https://codeforces.com/blog/entry/98663简而言之就是可以通过\(O(\frac{C\sqrtC}{w})\)的复杂度判断是否能够获得某种体积开不同大小bitsettemplate......
  • 如何使用git将某个文件回退到历史版本
    1.查看提交历史gitlogcommit4fe5108e0ca86d439f0da61751fac5845ec64f5c3commit38f9efd1f004996330a78c4b78372ba7c37469892commit5617205b96685ee157b67f3d66c71aa24cc378601会出现一些commitid2.找到需要回退的文件路径,如api/v2/s.php3.开始回退,要把api/v......
  • Scrapy框架基本使用(从安装到运行)
    Scrapy基本使用以抓取段子星中的标题和内容为例:https://duanzixing.com/1.Windows下安装:pipinstalltwistedpipinstallpywin32pipinstallscrapy2.创建工程#scrapystartproject<projectName>scrapystartprojectduanzixing3.新建爬虫源文件#进入工程目录......
  • MySQL学习(12)事务.md
    前言“古之欲正世调天下者,必先观国政,料事务,察民俗。“出自《管子·正世》,事务就是指要做的或所做的事情。一件事情要么做了,要么没做,才符合原则。转账不存在转了一半,也不存在我转给你10元,你却到账5元。ACID原则原子性(Atomicity)事务中的全部操作在数据库中是不可分割的,要么全部......