[转载]关于Quartz 线程处理说明

本文介绍了如何在Spring环境中及不使用Spring时控制Quartz定时任务的并发执行,包括使用concurrent属性和@DisallowConcurrentExecution注解的方法,并解释了这些配置的实际效果。

Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。
1.在Spring中这时需要设置concurrent的值为false, 禁止并发执行。

?
1
  <property name= "concurrent" value= "true" />

2.当不使用spring的时候就需要在Job的实现类上加@DisallowConcurrentExecution的注释
@DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的, 但意思并不是不能同时执行多个Job, 而是不能并发执行同一个Job Definition(由JobDetail定义), 但是可以同时执行多个不同的JobDetail, 举例说明,我们有一个Job类,叫做SayHelloJob, 并在这个Job上加了这个注解, 然后在这个Job上定义了很多个JobDetail, 如sayHelloToJoeJobDetail, sayHelloToMikeJobDetail, 那么当scheduler启动时, 不会并发执行多个sayHelloToJoeJobDetail或者sayHelloToMikeJobDetail, 但可以同时执行sayHelloToJoeJobDetail跟sayHelloToMikeJobDetail

@PersistJobDataAfterExecution 同样, 也是加在Job上,表示当正常执行完Job后, JobDataMap中的数据应该被改动, 以被下一次调用时用。当使用@PersistJobDataAfterExecution 注解时, 为了避免并发时, 存储数据造成混乱, 强烈建议把@DisallowConcurrentExecution注解也加上。

 

 

@DisallowConcurrentExecution

此标记用在实现Job的类上面,意思是不允许并发执行,按照我之前的理解是 不允许调度框架在同一时刻调用Job类,后来经过测试发现并不是这样,而是Job(任务)的执行时间[比如需要10秒]大于任务的时间间隔 [Interval(5秒)],那么默认情况下,调度框架为了能让 任务按照我们预定的时间间隔执行,会马上启用新的线程执行任务。否则的话会等待任务执行完毕以后 再重新执行!(这样会导致任务的执行不是按照我们预先定义的时间间隔执行)

测试代码,这是官方提供的例子。设定的时间间隔为3秒,但job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行,否则会在3秒时再启用新的线程执行

@PersistJobDataAfterExecution

此标记说明在执行完Job的execution方法后保存JobDataMap当中固定数据,在默认情况下 也就是没有设置 @PersistJobDataAfterExecution的时候 每个job都拥有独立JobDataMap

否则改任务在重复执行的时候具有相同的JobDataMap

原文链接 :http://www.open-open.com/lib/view/open1412993886655.html

文介绍了在Java项目中遇到Hikari连接池泄漏的问题,详细分析了问题的起源,发现即使增加leakDetectionThreshold值,问题依然存在。通过跟踪代码,定位到Spring Quartz定时任务与Hikari连接池的交互,揭示了连接泄漏检查的实现原理。最后提出了暂时增大leakDetectionThreshold的解决方案,并计划进一步研究Hikari创建连接池的过程,以彻底解决连接泄漏问题。 摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 > 使用 Hikari 数据源连接泄漏 问题的起源 现象 方案 Fast, simple, reliable. HikariCP is a "zero-overhead" production ready JDBC connection pool. At roughly 130Kb, the library is very light. Read about how we do it here. 这一段是 Hikari 的介绍,github 上的 地址,可以看到,最开始以 "Fast、simple、reliable"这三个词来介绍,“快、简单、可靠”说明了 Hikari 连接池为什么这么流行的原因。Spring Boot 2.0后默认的数据库连接池就是这个,好了,废话不多说,下面就来看看在使用中遇到的问题。 问题的起源 现在在用的项目由本人新建,新建不久后发现程序一启动完之后,就会报数据库连接池泄漏,开始以为设置的检查连接泄漏时间太短了,下面是连接池的配置: 然后把 leakDetectionThreshold 设置成 5000 毫秒,之前是 2000,然后发现消停了一段时间,确实没报 java.lang.Exception: Apparent connection leak detected这个异常了,但是后面不管执行一个什么操作还是会报连接泄漏。当时项目进度比较紧,这个错误又不影响使用,只是看日志的时候感觉程序出错了,所以一直拖到现在才来解决。 现象 以当时解决问题的思路,觉得把检测连接时间再设置大一点就行了,但是仔细一想,问题并没有想像中的那么简单,然后仔细跟了一下报错的类,发现是 Spring 中 Quartz 相关的类报出来的 最低0.47元/天 解锁文章 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.youkuaiyun.com/yutanbo123/article/details/114917469
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值