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的工作原理和如何在项目中实际应用。 1. **Quartz简介** - Quartz是Cron-like和Calendar-based作业调度的Java实现,它允许开发人员在应用程序中定义、安排...
总结,Spring支持的Quartz程序调度提供了强大的定时任务管理能力,结合Spring的依赖注入和管理功能,可以帮助开发者高效地构建和维护复杂的应用程序。在实际使用中,理解并熟练掌握Spring与Quartz的集成方式,以及...
通过阅读《Quartz 开发指南》PDF 和实践 QuartzWeb 示例,你可以深入了解 Quartz 的工作原理和实际运用,提升项目中的任务调度能力。无论是简单定时任务还是复杂的业务流程自动化,Quartz 都能提供强大的支持。
Quartz.NET 2.6 是一个强大的开源作业调度框架,专为.NET平台设计,用于创建、安排和执行任务。这个版本发布于2017年7月30日,是官方发布的实例代码,旨在帮助开发者更好地理解和应用Quartz.NET。 Quartz.NET的核心...
第7章的主题聚焦于实现Quartz监听器,这是一个关键特性,它使得开发者能够监控和响应Quartz调度器的事件。 在Quartz中,监听器提供了对作业执行、触发器状态改变和其他内部调度事件的观察能力。这有助于调试、日志...
在高并发场景下,Quartz能确保任务的正确调度和执行,避免了单线程模型下的资源争抢和阻塞问题。 5. **源码分析**:标签中的"源码"可能意味着文章涉及了Quartz的内部工作原理。Quartz的源码结构清晰,适合学习和...
Java任务调度是编程中一种重要的技术,用于自动化执行特定任务,如定时数据备份、系统监控、日志清理等。...在实际开发中,理解这些工具的工作原理和优缺点,有助于编写出更加稳定、高效的定时任务。
总之,"Quartz.netDemo.rar"是一个展示如何利用Quartz.NET进行多任务调度的实例,它通过XML配置文件实现了任务的动态加载和执行,为开发者提供了一种灵活且强大的定时任务解决方案。学习和理解这个示例,有助于掌握...
由于单体应用改为微服务项目,微服务项目的作业调度功能百花齐放,作业调度系统在整体项目体系中属于底层基础组件项目,整体需易于接入公司的监控和规范,原理需完全掌握,如任务执行出现问题,要有及时的报警以便...
Java定时任务是软件开发中一个不可或缺的特性,它允许程序在特定时间执行预定的任务,而无需用户干预。...无论使用哪种工具,理解其工作原理和最佳实践都是至关重要的,这样才能确保定时任务的有效性和可靠性。
对于更复杂的定时任务需求,可以考虑使用Windows服务或第三方库如Quartz.NET,它们提供了更高级的调度和管理功能。 以上就是ASP.NET实现定时任务的基本步骤和关键知识点,通过合理的设计和实现,可以构建出高效...
以上就是ASP.NET定时任务的基本原理和常见实现方式。在实际应用中,需要根据项目需求和性能考虑选择合适的定时任务库,并确保任务的可靠性和资源管理。同时,注意避免在定时任务中引发的并发问题和长时间运行任务...
讲解网络通信的基本原理和数据传输过程。 2. **Java网络API**:讲解Java提供的Socket编程接口,包括ServerSocket和Socket类,以及多线程处理客户端连接的方式。同时,可能会涉及DatagramSocket和MulticastSocket...
7. 集成其他技术:Spring2.5加强了与其他技术的集成,比如支持Quartz作业调度器、JMX管理以及EJB 3.0的无缝集成,让开发者能够更方便地利用这些企业级服务。 8. 异步处理:Spring2.5开始支持异步方法调用,允许...
在.NET框架中,`System.Timer`是用于在指定间隔执行代码的...在实际开发中,了解其工作原理和限制,能帮助我们更好地选择和使用定时器。希望本篇文章对理解`System.Timer`有所帮助,并能解决你在使用过程中遇到的问题。
在IT领域,定时器是一种非常...总的来说,定时器是编程中不可或缺的一部分,理解其工作原理和使用方式对于开发高效、稳定的软件系统至关重要。通过学习和实践,我们可以更好地掌握定时任务的实现,提高我们的编程技能。
在即时通讯场景下,Netty以其高效的I/O处理和非阻塞IO模型,确保了数据传输的高效性和实时性。 3. **Redis**: Redis是一款开源的内存数据结构存储系统,可作为数据库、缓存和消息代理使用。在这个项目中,Redis...
为了解决这个问题,需要配置异步执行器,并确保 @Async 能够正确识别。 8. **Quartz 与 Spring Task 的选择** - Spring Task 对简单定时任务的实现已经足够,但对于复杂的任务调度需求,例如任务间的依赖关系、...
高并发是互联网应用的常态,Java工程师需要理解线程池的原理和配置,如ThreadPoolExecutor,以及如何通过优化线程管理来提高系统性能。此外,还会涉及非阻塞I/O(NIO)和异步编程模型,如CompletableFuture和反应式...