好多年没来了,今天心血来潮,更几个帖子,

顺便看看几年前写的帖子,蛮有意思的。

废话不多说,进入正题

最近的项目中,我改造了历史的一堆quartz任务

第一版是,有一项业务流程 ,需要定时进行状态流转,所以搭建近十个任务去控制(业务流程有点长,此处就不繁述)

当然不仅仅是状态控制,还有相应的状态下进行复杂的业务步骤

所以,只能上任务,没有啥好的办法去玩,或者没想到(当初搭建的人也没想到,不是我,哈哈)

第二版的时候,需要该业务流程需要支持另外一个业务项的,可以配置

就是说原来的一堆定时任务,需要支持某种特定类型的数据,这一次需要支持更多一个的数据

不能简单的给内部数据筛选范围

因为时间是要求可控制的,第一版的任务A系列,第二版的任务B系列,要求分别能够进行时间配置。

所以,就是添加了一堆新的任务,业务代码是相同的,只是加了任务控制。

第三版,第四版。。。

现在的要求是,支持可配置的数据,意思就是,任务数不固定了,原来其他是加一个,就简单的添加响应的任务控制,无脑简单明了

但是现在不行了啊

原因是,quartz集群任务数量限制,

受的第一个限制,线程数,quartz的执行线程都是单独的,所以同时存在的线程数量有限,大小看各自的项目线程总数(每台机器上运行quartz的那个工程)

第二个限制,每个任务单独执行的话,数据库连接也是单独的啊,毕竟业务上还有依赖数据库的,所以数据连接池的大小也限制了任务总数(每台机器上运行quartz的那个工程的连接数)

第三个限制,还是数据库的,但是这个是针对数据库服务或者数据库负载服务的连接限制,所有连接该数据库或服务的总数不能超过上限,

第四个限制,quartz配置的任务数,org.quartz.threadPool.threadCount 和 org.quartz.threadPool.threadPriority 配置,这个应该都知道,就不说了,不知道的问知道的吧

例如A B C三台机器连的都D服务器的数据库,A B C三台机器的工程线程总数是 16(CPU16核,就算16吧,方便),数据库连接池大小10   D数据库公开连接20

那么,A B C同时16个任务在执行,就是48个,但是数据库只有30 (多的18个可能等,可能跪,随缘吧,这里不展开讨论)

但是D的对外连接只有20啊(那28个,呵呵,也随缘了),就这意思

所以,大家明白了,并不是无脑创建,有数量限制的,查起来还贼烦,以前出现过一次,后面有时间,单独整个帖子说这事,得有个一两年前的事情了吧

那么,我的方案就是,不再固定任务,而是,依次创建下一个任务

初始化第一批任务,然后执行的时候创建下一个任务,。。。这样,依次往下类推,就这么个意思

好,前因都说完了,进入正题

每天创建某一批任务的时候可能需要同时创建好几十

这些任务,只是TriggerBean不一样,但是JobDetail一样,Job当让也是一样的了

但是呢,发现个现象,创建的时候去qrtz_job_details 表查jobDetail 数据的时候呢,偶尔会发现不存在,

因为是同时,集群执行,可能就并发了,数据库不存在啊,就并发去qrtz_job_details 表创建记录,然后就各种冲突了啊,贼烦

两种解决方案,不是通用,只是我想到的两种能解决我的问题的,仅供大家参考自行去斟酌

一、常规的分布式锁处理,持锁对象去操作表,这个很简单,不赘述

二、quartz支持一个属性,durable,怎么说呢,quartz中有个机制 (见 https://www.cnblogs.com/onlywujun/p/3668703.html   或

https://blog.csdn.net/weixin_30838873/article/details/98019929 ),不定时会将没有TriggerBean指向的JobDetail销毁,就是在qrtz_job_details表中把jobDetail删掉

默认为false,当然,属性名大家去找类似的,各版本各开发商的quartz不一样,springquartz跟原生的quartz这玩意的属性名就不一样,大概这个意思的属性,大家自己找吧

改为true,然后创建出来的jobdetail,那怕没有triggerbean引用,也不会被销毁

这样,就适用我这种,每天重复创建一次性任务的场景下使用了,防止并发创建时的冲突,

当然,还有一个属性也有意思 concurrent 属性,意思是,多个triggerbean共同使用同一个jobdetail时,

如果该属性为false,那么他们是同步执行的,相当于jobdetail是一个有锁对象,谁抢到谁执行,其他人等待,为同步块

改为true的话,可以异步并发执行,好玩不,大家去试试吧。。。

大概就写这么点了,代码就不贴了,自己去搜索吧

文章写的随心,没有格式,哈哈哈

quartz的JobDetail属性(durable / concurrent)相关推荐

  1. Quartz修改JobDetail

    可以调用org.quartz.Scheduler.add(JobDetail,boolean)方法添加一个JobDetail, 不过需要注意的是,JobDetail需要设置原先JobDetail相同的 ...

  2. Spring - Java/J2EE Application Framework 应用框架 第 18 章 使用Quartz或Timer完成时序调度工作

    第 18 章 使用Quartz或Timer完成时序调度工作 18.1. 简介 Spring提供了支持时序调度(译者注:Scheduling,下同)的整合类.现在, Spring支持内置于1.3版本以来 ...

  3. 通过SPANN方式将Spring&Quartz与自定义注释集成

    在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...

  4. 使用SPANN方式将Spring&Quartz与自定义注释集成

    在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...

  5. Spring整合Quartz实现定时任务

    Quartz框架是一个极其成功的开源任务调度框架,目前很多公司在实现任务调度上都直接使用或在借鉴的基础上实现了自己的任务调度框架,Quartz使用Trigger,Job和JobDetail对象实现调度 ...

  6. Spring和Quartz实现的定时任务调度

    Corn表达式 一.增加所依赖的JAR包 1. 增加Spring的Maven依赖 [html] view plaincopy <dependency> <groupId>org ...

  7. quartz的使用(一)

    1.   pom.xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId&g ...

  8. 定时任务:Quartz 详解

    定时任务:Quartz 详解 文章目录 定时任务:Quartz 详解 1 Quartz是什么? 2 Quartz核心组成 3 Quartz核心模块理解 3.1 用工厂模式理解 Quartz 的设计机制 ...

  9. 解决Spring中使用quartz发生NotSerializableException methodInvoker的问题

    Spring2.5 + quartz1.6.5 发生如下异常 Caused by: org.quartz.JobPersistenceException: Couldn't store job: Un ...

最新文章

  1. 铲屎官福音:汪星人和喵星人的小情绪,AI 可以识别了
  2. 2015年下半年计划
  3. AWS云使用100条宝贵经验分享
  4. logistic逻辑回归分类算法及应用
  5. 第三次学JAVA再学不好就吃翔(part77)--迭代器遍历
  6. 题目1179:阶乘-------------阶乘不用long long int 就不能AC
  7. linux系统批量装机,PXE+Kickstart实现无人值守批量安装Linux
  8. 使用R完成决策树分类
  9. 人工智能时代,Python编程就业方向那么广,我该如何选择?
  10. tms intraweb html5,TMS VCL Chart
  11. 每一个都能笑抽的39个奇葩代码注释
  12. 开发国信股票自动交易软件
  13. Oracle官网下载各版本JDK+查看各版本的API文档
  14. 外包被裁能要n+1吗?签约软通动力,在滴滴工作,滴滴裁员,我要n+1,软通不认!...
  15. 介绍一个产品的思维导图_产品经理可以用思维导图做什么?
  16. 怎么登录163vip邮箱,登录方式有哪些?
  17. AGC001 E BBQ Hard
  18. Grafana资料搜集
  19. 涨握在线|马云接班人;外资取限;iPhone后继有人
  20. CSS 单行/多行文本溢出显示省略号(...)的实现

热门文章

  1. python多张图片生成ppt_天呐,还能这么玩!用 Python 生成动态 PPT
  2. CTF压缩包加密破解总结
  3. Excel VBA合并不同工作簿所有工作表到一张工作表
  4. WAP.WXL.WMLScript备课笔记
  5. SHOI2002 百事世界杯之旅
  6. b站pink老师JavaScript的jQuery 案例代码——电梯导航案例
  7. 软考高项 ——【项目风险管理】
  8. ubuntu下git使用Beyond Compare来做diff和merge方法
  9. Java 1046 划拳
  10. 题目:用D触发器带同步高置数和异步高复位端的二分频的电路,画出逻辑电路,Verilog描述。