springboot quartz 分布式定时任务

即使一手托帝城 背负天渊 我安澜也一样无敌于世间

俞陀救我!!!

quartz 简介及核心组件 :

quartz 的调度策略是以数据库资源为中介的一种异步策略,各个节点的调度器都遵守基于数据库锁的操作规则从而保证了任务执行的唯一性具体体现在 quartz 中的 quartz_locks 表,quartz 采用了悲观锁的方式对 triggers 行行加锁,从而保证了任务同步的正确性。当某个节点的某个线程在任务执行时间点获取到该 triggers 的锁时,该任务的这次执行就会发生在该节点上,同时当其它节点在该任务执行时间点触发该任务时发现锁被占用,则会忽略此次执行。其中一个任务可被两个节点执行,即这次节点一执行,下一次节点二执行(前提是获取到锁)

  • Job 定时任务的具体内容
  • JobDetail 可被调度容器调度的调度程序,其中 Job 是必要组成部分
  • Trigger 定时任务触发器
  • Secheduler 调度容器,主要组成部分为 JobDetail 和 Trigger(两者一一对应),容器内可注册多对调度对象

quartz 相关表 :

建表语句在引入的依赖包中可找到,org.quartz.impl.jdbcjobstore 下的 tables_mysql_innodb.sql(适用于 mysq,目录下有支持几乎所有主流数据库的 sql 文件,不同版本的 sql 文件位置可能不一样)

  • qrtz_blob_triggers trigger 作为 blob 类型存储,(用于用户定制的 trigger 而 JobStore 不知道的类型的存储)
  • qrtz_calendars calendars 作为 blob 类型存储
  • qrtz_cron_triggers 存储程序中已配置的 cron 信息,包括 cron 表达式、trigger 名称和时区等信息
  • qrtz_fired_triggers 存储已触发的 trigger 和对应 job 相关信息(是吗?我觉得不像)
  • qrtz_job_details 存储已配置的 job 信息
  • qrtz_locks 存储程序对任务操作时锁的信息
  • qrtz_paused_trigger_grps 存储已暂停的 trigger 信息
  • qrtz_scheduler_state 存储 scheduler 的相关状态信息
  • qrtz_simple_triggers 存储 trigger 信息,包括重复次数、间隔和已触发次数等
  • qrtz_simprop_triggers 存储 CalendarIntervalTrigger 和 DailyTimeIntervalTrigger
  • qrtz_triggers 存储已配置的 trigger 信息

注: 详细情况参考 https://www.cnblogs.com/zyulike/p/13671130.html

springboot 整合 quartz 依赖 :

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

application.yml:

spring:quartz:auto-startup: true   # 服务启动后自动启动任务job-store-type: jdbc   # job 存储类型 默认为 memory 只有设置为 jdbc 时才可持久化到数据库jdbc:initialize-schema: always   # 初始化数据库 always 表示服务每次启动都会在配置的数据库中创建 quartz 对应的表

quartz.properties :

# quartz.properties 文件为 quartz 配置文件,若不配置,则使用 jar 包自带的默认文件
# 默认配置文件位于 jar 包 org.quartz 目录下
#
############################# 调度容器配置 #############################
# 调度容器名称 集群中所有示例名称都必须相同(非必须 默认 QuartzScheduler)
org.quartz.scheduler.instanceName = springboot-quartz
# 调度容器 id(非必须 默认 NON_CLUSTERED)
org.quartz.scheduler.instanceId = AUTO
# quartz-scheduler 出口本身通过 rmi 作为服务器(非必须 默认未 false)
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
# 如果想使用 quartz 在执行 job 前使用 UserTransaction,则设置为 true(非必须 默认为 false)
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false############################# 定时任务线程池配置 #############################
# 定时任务线程池 SimpleThreadPool 几乎满足所有用户需求(必须 默认 null)
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# 线程池线程数(必须 默认 -1)
org.quartz.threadPool.threadCount = 2
# 线程池线程优先级(非必须 默认 5 最小 1最大 10)
org.quartz.threadPool.threadPriority = 5
# 是否未守护线程
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true############################# 调度器配置 #############################
# 调度器相关信息存储(非必须 默认 org.quartz.simpl.RAMJobStore)
# org.quartz.simpl.RAMJobStore: 存储在 RAM 中 org.quartz.impl.jdbcjobstore.JobStoreTX: 存储在数据库中
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
# 当存储方式为 JobStoreTX 时持久化方式为 org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 设置 JDBCJobStore 中的 JobDataMaps 以键值对形式存储
org.quartz.jobStore.useProperties = true
# 是否集群、负载均衡、容错(非必须 默认 false)
org.quartz.jobStore.isClustered = true
# quartz 数据源(数据源命名随意,但需与下面持久化配置中保持一致)
org.quartz.jobStore.dataSource = quartzDataSource
# quartz 相关表名前缀
org.quartz.jobStore.tablePrefix = QRTZ_############################# 持久化配置 #############################
# quartz 持久化连接池(非必须 默认 cp30)
# quartz 本身默认支持 cp30 和 hikaricp 若想使用 druid 则值为 com.cbw.quartz02.util.DruidConnectionProvider
org.quartz.dataSource.quartzDataSource.provider = hikaricp
# 数据库相关配置
org.quartz.dataSource.quartzDataSource.driver = com.mysql.cj.jdbc.Driver
org.quartz.dataSource.quartzDataSource.URL = jdbc:mysql://ip:3306/springboot-quartz?useUnicode=true&characterEncoding=utf8&useSSL=false&&serverTimezone=UTC
org.quartz.dataSource.quartzDataSource.user = root
org.quartz.dataSource.quartzDataSource.password = ******
# 最大连接数(听说当数据库连接池为 druid 时为 maxConnection 为 cp30 和 hikaricp 时为 maxConnections 未测试)
org.quartz.dataSource.quartzDataSource.maxConnections = 10

创建定时任务 :

// 创建两个定时任务
public class OneJobBean extends QuartzJobBean {private static final Logger logger = LogManager.getLogger(OneJobBean.class);@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {logger.info("定时任务一 threadName = " + Thread.currentThread().getName() +" time = " + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));}
}public class TwoJobBean extends QuartzJobBean {private static final Logger logger = LogManager.getLogger(OneJobBean.class);@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {logger.info("定时任务二 threadName = " + Thread.currentThread().getName() +" time = " + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));}
}

QuartzConfig :

@Configuration
@EnableScheduling
public class QuartzConfig {/*** 定时任务一 job detail* @return*/@Beanpublic JobDetailFactoryBean oneJobDetail() {JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();// 定时任务具体业务类jobDetailFactoryBean.setJobClass(OneJobBean.class);// 定时任务名称 可从配置文件加载jobDetailFactoryBean.setName("one job");return jobDetailFactoryBean;}/*** 定时任务一 cron trigger* @return*/@Beanpublic CronTriggerFactoryBean oneCronTrigger() {CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();// 将 job detail 设置到触发器cronTriggerFactoryBean.setJobDetail(oneJobDetail().getObject());// 定时任务执行时间 可从配置文件加载cronTriggerFactoryBean.setCronExpression("0/5 * * * * ?");return cronTriggerFactoryBean;}/*** 定时任务二 job detail* @return*/@Beanpublic JobDetailFactoryBean twoJobDetail() {JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();jobDetailFactoryBean.setJobClass(TwoJobBean.class);jobDetailFactoryBean.setName("two job");return jobDetailFactoryBean;}/*** 定时任务二 cron trigger* @return*/@Beanpublic CronTriggerFactoryBean twoCronTrigger() {CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();cronTriggerFactoryBean.setJobDetail(twoJobDetail().getObject());cronTriggerFactoryBean.setCronExpression("0/10 * * * * ?");return cronTriggerFactoryBean;}/*** 定时任务调度容器工厂* @return*/@Beanpublic SchedulerFactoryBean schedulerFactoryBean() {SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();// quartz 配置文件 若不设置则使用默认配置文件schedulerFactoryBean.setConfigLocation(new ClassPathResource("/config/quartz.properties"));// 将定时任务设置到工厂schedulerFactoryBean.setTriggers(oneCronTrigger().getObject(), twoCronTrigger().getObject());// 启动后定时任务执行延迟时间 单位 sschedulerFactoryBean.setStartupDelay(10);return schedulerFactoryBean;}
}

长路漫漫 该当如何

@XGLLHZ-无条件.mp3

springboot + quartz 分布式定时任务相关推荐

  1. 第四十章:基于SpringBoot Quartz完成定时任务分布式多节点负载持久化

    在上一章[第三十九章:基于SpringBoot & Quartz完成定时任务分布式单节点持久化]中我们已经完成了任务的持久化,当我们创建一个任务时任务会被quartz定时任务框架自动持久化到数 ...

  2. springboot+quartz构建定时任务

    springboot+quartz构建定时任务 开发环境 Quartz的3个基本要素 如何使用 引入相关依赖 resource目录下创建quartz.properties quartz需要用到的表 实 ...

  3. Quartz 分布式定时任务动态添加删除定时任务

    首先对于Quartz的原理和使用这里不再做赘述和讲解,相信大家可以自信查阅文档进行使用.先说一下个人的这个使用背景:项目中需要引入定时任务,框架是springcloud分布式系统然后调研之后决定引入Q ...

  4. SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)

    最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...

  5. SpringBoot结合Quartz实现定时任务

    <从零打造项目>系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 ...

  6. 解决springboot + quartz的分布式问题以及dolphinscheduler

    springboot + quartz 将quartz存储默认在内存中, 多节点部署时存在分布式问题. 改成基于数据库的quartz分布式集群解决方案, 参考官方文档, 需要为quartz单独配置da ...

  7. quartz 分布式_6大分布式定时任务对比

    作者 | sharedCode 来源 | blog.csdn.net/u012394095/article/details/79470904 分布式定时任务简介 把分散的,可靠性差的计划任务纳入统一的 ...

  8. quartz分布式集群部署并且可视化配置job定时任务

    2019独角兽企业重金招聘Python工程师标准>>> 项目使用quartz框架完成了定时任务集群部署调度,并且对quartz进一步封装完成在web界面可动态配置定时任务.定时任务如 ...

  9. 3分钟掌握Quartz.net分布式定时任务的姿势

    长话短说,今天聊一聊分布式定时任务,我的流水账笔记: ASP.NET Core+Quartz.Net实现web定时任务 AspNetCore结合Redis实践消息队列 细心朋友稍一分析,就知道还有问题 ...

  10. 基于spring+quartz的分布式定时任务框架

    http://www.cnblogs.com/aaronfeng/p/5537177.html 问题背景 我公司是一个快速发展的创业公司,目前有200人,主要业务是旅游和酒店相关的,应用迭代更新周期比 ...

最新文章

  1. css3替代图片的尖角圆角效果
  2. 前端组件库 - 搭建web app常用的样式/组件等收集列表(移动优先)
  3. 现代软件工程系列 创新靠学分
  4. 第 10 章 容器监控 - 085 - 如何快速部署 Prometheus?
  5. 用java语言编写石头剪刀布获胜法_石头剪刀布Java实现
  6. python大神写的代码_【python】抄写大神的糗事百科代码
  7. DirectX简单的FBX文件加载(网格MESH)
  8. JavaScript设计打字速度测试游戏的实现
  9. 从祖师级到新生代,48位开发者的「武功秘籍」
  10. 基于lingo的线性回归和非线性回归
  11. 监控系统网络未找到dhcp服务器,监控显示未找到dhcp服务器
  12. ubuntu中smbd服务搭建,ifcongfig命令没有IP地址
  13. 微软project下载安装及激活教程
  14. 怎么让搜狗收录-如何加快搜狗收录
  15. Ipad各系列年代顺序
  16. 模仿360安全卫士项目笔记3
  17. 2345看图王如何关闭广告
  18. 洗地机那个牌子好?洗地机品牌排行榜
  19. 第二十一章 数据库角色
  20. 极限(不定式)求法总结

热门文章

  1. 单个dcm文件含有多帧数据,如何拆分成多个dcm文件
  2. idea运行SSM项目配置tomcat及启动
  3. 数学建模层次分析法例题及答案_【数模】层次分析法 - 全国大学生数学建模竞赛(CUMCM) - 数学建模社区-数学中国...
  4. 清风老师数学建模笔记——层次分析法
  5. 【C++设计模式】抽象工厂模式
  6. 小白教程系列——XMind8 Pro下载安装
  7. Xmind8 Pro 最新版 破解教程(序列号|破解文件)
  8. Honor V10 BKL-AL20 ROOT(Magisk方式)
  9. 消息队列以及非常牛的kafka
  10. 淘客基地淘客小程序微信审核通过率90%以上的独家秘籍