`
isiqi
  • 浏览: 16489967 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Quartz调度器堵塞原理和解决

阅读更多

Quartz 调度器以多线程的方式执行调度任务JobDetail,缺省线程池大小为10,也就是说若调度器中已有10个Job在工作(线程没有结束),那么即使有JobDetail到了被触发的时间,新的JobDetail不会被执行,也就是说阻塞的条件是,调度器中正在运行的JobDetail数量达到了设定值10。

举一个具体的例子:

a. 单一Job

配置:

JobA 触发时间为 每秒运行一次,每个Job执行时间为30秒

运行:

1、 10个JobA将连续启动

2、 到第10个JobA启动后,线程池中所有线程被耗尽,调度器出现了阻塞,即没有新的JobA启动,尽管设置为每秒执行一次。

3、30秒后,将有1个以上JobA执行完毕,在短时间内,新的10个JobA又被启动,再次进入2的阻塞状态

2状态可以称做调度器阻塞状态,没有新的Job能执行,导致一些诸如定时读取数据的操作无法继续下去。除非有JobA执行完毕,新的JobA才能被执行。实际运行中,假设调度器中有一个JobA线程的执行时间大于两次启动间隔,则经过若干次操作后,将耗尽所有10个线程资源,导致其他的调度任务阻塞。

b. 多个Job(无状态Job)

在这个测试中,可以有多种不同的Job(无状态Job),但它们均共享这10个线程,任何一个Job 线程执行时间大于两次启动间隔均有可能导致调度器被阻塞。例如:

配置:

JobA 触发时间为 每秒运行一次,每个Job执行时间为30秒;JobB 触发时间为每秒运行一次,每次执行时间小于1秒

运行:

1。JobA和JobB相继启动

2。几秒钟后JobA数量达到10,其间JobB被执行若干次,则新的JobA和JobB均不能被启动,调度器进入阻塞状态

3。30秒后,JobA(0-9)相继执行完毕,新的JobA和JobB均有机会被重新启动,短时间内,再次进入2的阻塞状态

如何解决调度器阻塞问题?

1、 延长可能需要较长时间执行的JOB的时间间隔,假设Job执行时间最大时间为t1, 两次任务执行间隔调度时间为d1, 则d1>t1

2、 使用有状态调度任务StatefulJob代替没有状态的Job. 对于要求执行间隔时间尽可能短,又不希望造成阻塞的比较适合。可以同时有无状态的调度任务JobA,和有状态的调度任务JobB,JobB堵塞后不会对JobA造成影响,即读报文的任务阻塞了,不会对调度器中其他任务造成影响,同时JobA执行完后,可再次继续下一个任务。

如果JobA执行时间较长的话,可能造成JobA始终占用一个线程资源。

3、注意:一个调度器中如果有很多个Job(JobA,JobB,JobC...),其中有一个很容易堵塞,则该Job也会造成其他的Job阻塞

线程池大小配置在org.quartz下的quartz.properties文件中

org.quartz.threadPool.threadCount = 10

如若要修改线程池的大小,可以修改该文件中的 org.quartz.threadPool.threadCount值。亦可建一org.quartz包,包下放置quartz.properties文件,覆盖掉quartz.jar中的配置

但是,修改线程池的大小并不能解决调度器阻塞问题,因为资源消耗的速度不及资源释放的速度时,资源就会被耗尽。


分享到:
评论

相关推荐

    quartz定时调度完整实例

    在这个"quartz定时调度完整实例"中,我们将深入理解Quartz的工作原理和如何在项目中实际应用。 1. **Quartz简介** - Quartz是Cron-like和Calendar-based作业调度的Java实现,它允许开发人员在应用程序中定义、安排...

    Spring支持的Quartz程序调度

    总结,Spring支持的Quartz程序调度提供了强大的定时任务管理能力,结合Spring的依赖注入和管理功能,可以帮助开发者高效地构建和维护复杂的应用程序。在实际使用中,理解并熟练掌握Spring与Quartz的集成方式,以及...

    Quartz 开发指南(附源码)

    通过阅读《Quartz 开发指南》PDF 和实践 QuartzWeb 示例,你可以深入了解 Quartz 的工作原理和实际运用,提升项目中的任务调度能力。无论是简单定时任务还是复杂的业务流程自动化,Quartz 都能提供强大的支持。

    Quartz.NET 2.6

    Quartz.NET 2.6 是一个强大的开源作业调度框架,专为.NET平台设计,用于创建、安排和执行任务。这个版本发布于2017年7月30日,是官方发布的实例代码,旨在帮助开发者更好地理解和应用Quartz.NET。 Quartz.NET的核心...

    Quartz Job Scheduling Framework第7章翻译初稿

    第7章的主题聚焦于实现Quartz监听器,这是一个关键特性,它使得开发者能够监控和响应Quartz调度器的事件。 在Quartz中,监听器提供了对作业执行、触发器状态改变和其他内部调度事件的观察能力。这有助于调试、日志...

    定时器quartz的应用

    在高并发场景下,Quartz能确保任务的正确调度和执行,避免了单线程模型下的资源争抢和阻塞问题。 5. **源码分析**:标签中的"源码"可能意味着文章涉及了Quartz的内部工作原理。Quartz的源码结构清晰,适合学习和...

    Java调度原理及使用.docx

    Java任务调度是编程中一种重要的技术,用于自动化执行特定任务,如定时数据备份、系统监控、日志清理等。...在实际开发中,理解这些工具的工作原理和优缺点,有助于编写出更加稳定、高效的定时任务。

    Quartz.netDemo.rar

    总之,"Quartz.netDemo.rar"是一个展示如何利用Quartz.NET进行多任务调度的实例,它通过XML配置文件实现了任务的动态加载和执行,为开发者提供了一种灵活且强大的定时任务解决方案。学习和理解这个示例,有助于掌握...

    java实现学生管理系统源码-kob:中心化的作业调度系统,定义了任务调度模型,实现了任务调度的统一管理和监控

    由于单体应用改为微服务项目,微服务项目的作业调度功能百花齐放,作业调度系统在整体项目体系中属于底层基础组件项目,整体需易于接入公司的监控和规范,原理需完全掌握,如任务执行出现问题,要有及时的报警以便...

    java定时任务开源案例

    Java定时任务是软件开发中一个不可或缺的特性,它允许程序在特定时间执行预定的任务,而无需用户干预。...无论使用哪种工具,理解其工作原理和最佳实践都是至关重要的,这样才能确保定时任务的有效性和可靠性。

    asp.net定时任务(定时器)

    对于更复杂的定时任务需求,可以考虑使用Windows服务或第三方库如Quartz.NET,它们提供了更高级的调度和管理功能。 以上就是ASP.NET实现定时任务的基本步骤和关键知识点,通过合理的设计和实现,可以构建出高效...

    ASP.NET定时任务

    以上就是ASP.NET定时任务的基本原理和常见实现方式。在实际应用中,需要根据项目需求和性能考虑选择合适的定时任务库,并确保任务的可靠性和资源管理。同时,注意避免在定时任务中引发的并发问题和长时间运行任务...

    java网络编程与分布式计算

    讲解网络通信的基本原理和数据传输过程。 2. **Java网络API**:讲解Java提供的Socket编程接口,包括ServerSocket和Socket类,以及多线程处理客户端连接的方式。同时,可能会涉及DatagramSocket和MulticastSocket...

    spring源码

    7. 集成其他技术:Spring2.5加强了与其他技术的集成,比如支持Quartz作业调度器、JMX管理以及EJB 3.0的无缝集成,让开发者能够更方便地利用这些企业级服务。 8. 异步处理:Spring2.5开始支持异步方法调用,允许...

    C#关于System.Timer的用法

    在.NET框架中,`System.Timer`是用于在指定间隔执行代码的...在实际开发中,了解其工作原理和限制,能帮助我们更好地选择和使用定时器。希望本篇文章对理解`System.Timer`有所帮助,并能解决你在使用过程中遇到的问题。

    定时器相关文章

    在IT领域,定时器是一种非常...总的来说,定时器是编程中不可或缺的一部分,理解其工作原理和使用方式对于开发高效、稳定的软件系统至关重要。通过学习和实践,我们可以更好地掌握定时任务的实现,提高我们的编程技能。

    springboot+netty点对点即时通讯、聊天

    在即时通讯场景下,Netty以其高效的I/O处理和非阻塞IO模型,确保了数据传输的高效性和实时性。 3. **Redis**: Redis是一款开源的内存数据结构存储系统,可作为数据库、缓存和消息代理使用。在这个项目中,Redis...

    Spring框架_SpringBoot_定时任务_深入教程.pdf

    为了解决这个问题,需要配置异步执行器,并确保 @Async 能够正确识别。 8. **Quartz 与 Spring Task 的选择** - Spring Task 对简单定时任务的实现已经足够,但对于复杂的任务调度需求,例如任务间的依赖关系、...

    互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识

    高并发是互联网应用的常态,Java工程师需要理解线程池的原理和配置,如ThreadPoolExecutor,以及如何通过优化线程管理来提高系统性能。此外,还会涉及非阻塞I/O(NIO)和异步编程模型,如CompletableFuture和反应式...

Global site tag (gtag.js) - Google Analytics