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

Spring使用之:Quartz定时任务为什么会被阻塞

阅读更多

Spring使用之:Quartz定时任务为什么会被阻塞

文章分类:Java编程 关键字: spring, quartz, 定时任务 问题:

周日,公司CTO给我打电话说,监控系统的数据从下午1点就不更新了。我登录服务器排除了数据同步问题,查看日志也没有例外抛出,查询了前一天的 日志发现几个数据库表空间溢出例外。最后定位,Spring定时任务挂掉了。重启应用恢复正常。周一早上,同样的问题又发生了,6点开始定时任务又停了。 Spring定时任务为什么会被阻塞呢?

原因:

周一中午,我在进行接口状态监控测试时发现,接口状态查询任务尽然会执行半小时。问题找到了,由于我在接口状态查询任务中没有设置读超时、在接口 网络繁忙时,接口状态查询任务会占用很长的时间,Spring定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行。接口状 态查询任务每5分钟执行一次,假如每次都执行1小时的话,其他任务就会被阻塞。因为Quartz的线程都被接口状态查询任务占用了。其他任务只有等待。

解决方法:

1.将JobDetail的concurrent属性配置为false。不允许任务并发执行。
2.任务执行时间较长时,查找根本问题。

实验:

JobOne.java

Java代码
  1. package test.job;
  2. import java.util.Date;
  3. public class JobOne{
  4. public void execute(){
  5. System.out.println("executeJobOne(" + new Date()+ ")" );
  6. try {
  7. Thread.sleep(1000000 );
  8. }catch (InterruptedExceptionire){
  9. }
  10. }
  11. }


JobTwo.java

Java代码
  1. package test.job;
  2. import java.util.Date;
  3. public class JobTwo{
  4. public void execute(){
  5. System.out.println("executeJobTwo(" + new Date()+ ")" );
  6. }
  7. }



配置文件

Xml代码
  1. <? xml version = "1.0" encoding = "UTF-8" ?>
  2. < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:tx = "http://www.springframework.org/schema/tx"
  4. xsi:schemaLocation ="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-
  5. beans-2.0.xsd
  6. http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd
  7. http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
  8. <!--=====jobOne=====-->
  9. <!--job-->
  10. < bean id = "jobOne" class = "test.job.JobOne" >
  11. </ bean >
  12. <!--jobdetail-->
  13. < bean id = "jobOneDetail" class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >
  14. < property name = "targetObject" ref = "jobOne" />
  15. < property name = "targetMethod" value = "execute" />
  16. < property name = "concurrent" value = "true" />
  17. </ bean >
  18. <!--Trigger-->
  19. < bean id = "jobOneSimpleTrigger" class = "org.springframework.scheduling.quartz.SimpleTriggerBean" >
  20. < property name = "jobDetail" ref = "jobOneDetail" />
  21. < property name = "startDelay" > < value > 0 </ value > </ property >
  22. < property name = "repeatInterval" > < value > 1000 </ value > </ property >
  23. </ bean >
  24. <!--=====jobTwo=====-->
  25. <!--job-->
  26. < bean id = "jobTwo" class = "test.job.JobTwo" >
  27. </ bean >
  28. <!--jobdetail-->
  29. < bean id = "jobTwoDetail" class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >
  30. < property name = "targetObject" ref = "jobTwo" />
  31. < property name = "targetMethod" value = "execute" />
  32. < property name = "concurrent" value = "true" />
  33. </ bean >
  34. <!--Trigger-->
  35. < bean id = "jobTwoSimpleTrigger" class = "org.springframework.scheduling.quartz.SimpleTriggerBean" >
  36. < property name = "jobDetail" ref = "jobTwoDetail" />
  37. < property name = "startDelay" > < value > 0 </ value > </ property >
  38. < property name = "repeatInterval" > < value > 1000 </ value > </ property >
  39. </ bean >
  40. <!--=====Schedule=====-->
  41. <!--schedule-->
  42. < bean class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" >
  43. < property name = "triggers" >
  44. < list >
  45. < ref local = "jobOneSimpleTrigger" />
  46. < ref local = "jobTwoSimpleTrigger" />
  47. </ list >
  48. </ property >
  49. </ bean >
  50. </ beans >



MAIN类:

Java代码
  1. package test.job;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class JobTest{
  5. private ApplicationContextac;
  6. public JobTest(ApplicationContextac){
  7. this .ac=ac;
  8. }
  9. /**
  10. *@paramargs
  11. */
  12. public static void main(String[]args){
  13. JobTestjob=new JobTest( new ClassPathXmlApplicationContext( "applicationContext.xml" ));
  14. }
  15. }



测试结果:

当jobOne的concurrent为true时:

execute JobOne(Thu Jan 24 13:40:22 CST 2008)
execute JobTwo(Thu Jan 24 13:40:22 CST 2008)
execute JobOne(Thu Jan 24 13:40:22 CST 2008)
execute JobTwo(Thu Jan 24 13:40:22 CST 2008)
execute JobOne(Thu Jan 24 13:40:23 CST 2008)
execute JobTwo(Thu Jan 24 13:40:23 CST 2008)
execute JobOne(Thu Jan 24 13:40:24 CST 2008)
execute JobTwo(Thu Jan 24 13:40:24 CST 2008)
execute JobOne(Thu Jan 24 13:40:25 CST 2008)
execute JobTwo(Thu Jan 24 13:40:25 CST 2008)
execute JobOne(Thu Jan 24 13:40:26 CST 2008)
execute JobTwo(Thu Jan 24 13:40:26 CST 2008)
execute JobOne(Thu Jan 24 13:40:27 CST 2008)
execute JobTwo(Thu Jan 24 13:40:27 CST 2008)
execute JobOne(Thu Jan 24 13:40:28 CST 2008)
execute JobTwo(Thu Jan 24 13:40:28 CST 2008)
execute JobOne(Thu Jan 24 13:40:29 CST 2008)
execute JobTwo(Thu Jan 24 13:40:29 CST 2008)
execute JobOne(Thu Jan 24 13:40:31 CST 2008)

(JobOne并发执行,到这里所有任务阻塞没有信息输出,可以看出默认有10个线程,都被JobOne占用)

当jobOne的concurrent为false时:

execute JobOne(Thu Jan 24 13:43:00 CST 2008)
execute JobTwo(Thu Jan 24 13:43:00 CST 2008)
execute JobTwo(Thu Jan 24 13:43:00 CST 2008)
execute JobTwo(Thu Jan 24 13:43:01 CST 2008)
execute JobTwo(Thu Jan 24 13:43:02 CST 2008)
execute JobTwo(Thu Jan 24 13:43:03 CST 2008)
execute JobTwo(Thu Jan 24 13:43:04 CST 2008)
execute JobTwo(Thu Jan 24 13:43:05 CST 2008)
execute JobTwo(Thu Jan 24 13:43:06 CST 2008)
execute JobTwo(Thu Jan 24 13:43:07 CST 2008)
execute JobTwo(Thu Jan 24 13:43:08 CST 2008)
execute JobTwo(Thu Jan 24 13:43:09 CST 2008)

(JobOne不并发执行,JobTwo不会被阻塞)

分享到:
评论

相关推荐

    Spring的quartz和Timer实现定时

    在Java世界中,任务调度是十分重要的,Spring框架提供了多种定时任务实现方式,其中包括Quartz和Timer。Quartz是一款开源的作业调度框架,而Timer是Java标准库中的一个类,用于执行定时任务。这两个工具都能帮助...

    spring中邮件及定时任务

    Spring的定时任务基于Quartz或Spring的TaskScheduler,它们都是强大的任务调度库,可以处理复杂的定时逻辑。 Spring还提供了`@Async`注解来实现异步任务,这在处理耗时操作时非常有用。当一个方法被`@Async`标记后...

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

    - 默认情况下,多个定时任务会串行执行。如果需要并发执行,需要增加线程池的线程数量。并发执行时,任务的执行顺序取决于线程调度,而不是特定的顺序。 5. **相同表达式的定时任务执行** - 即使多个任务具有...

    定时任务demo

    "spring-quartz-master"这个文件名表明我们的示例可能基于Spring框架集成Quartz作为定时任务的调度器。Quartz是一个开源的作业调度框架,广泛用于Java应用中,它提供了强大的定时任务管理能力。 首先,让我们了解...

    Spring+Schedule(定时任务)小示例

    本示例主要关注Spring框架的一个重要特性——定时任务(Schedule),这使得开发者能够轻松地实现周期性任务的执行,无需手动创建线程或者使用第三方库。接下来,我们将深入探讨Spring Schedule的相关知识点。 首先...

    Spring中使用Quartz(二)

    在Spring框架中集成Quartz是一个常见的任务调度解决方案,它提供了高度可配置的定时任务执行功能。Quartz是一个开源的工作调度库,可以与Java应用程序无缝集成,用于创建、调度和执行计划任务。本篇将深入探讨如何在...

    java定时任务调度

    在Java中,有多种实现定时任务调度的方式,包括但不限于Java内置的`java.util.Timer`类、Spring框架的`@Scheduled`注解以及Quartz库。 1. **Java内置的`java.util.Timer`和`TimerTask`**: - `Timer`类用于创建一...

    springboot-scheduler定时任务学习demo源码

    这个"springboot-scheduler定时任务学习demo源码"提供了一个实践示例,帮助开发者深入理解如何在Spring Boot项目中配置和使用定时任务。 首先,让我们了解Spring Boot的定时任务(Scheduler)是如何工作的。在...

    Spring支持的Quartz程序调度

    Spring框架是Java开发中广泛使用的应用框架,而Quartz则是一个功能强大的作业调度库,能够帮助开发者在应用程序中实现定时任务的安排。本篇文章将深入探讨Spring如何与Quartz集成,以及它们之间的协同工作原理。 ...

    QuartzSpring

    Quartz和Spring是两个在...综上所述,Quartz与Spring的集成使得定时任务的管理变得更加方便和高效,同时也为应用提供了更强大的定时任务解决方案。开发者可以根据具体需求灵活配置和扩展,以满足各种复杂的调度场景。

    Springboot 定时任务(task)

    在Spring Boot框架中,Spring Task是用于实现定时任务的一个强大工具。它允许开发者方便地创建和管理定时任务,而无需依赖外部的调度库,如Quartz或Cron。本项目利用了Spring Task的异步执行特性,以防止任务执行...

    使用多线程开启定时任务(注解版)

    而`quartz`或`Spring Framework`中的`@Scheduled`注解则提供了一种更加优雅的方式来创建定时任务。 `@Scheduled`是Spring框架提供的一个强大注解,它可以让我们在不编写额外调度代码的情况下,直接在方法上标注以...

    java定时任务开源案例

    在Java世界里,实现定时任务的方式多种多样,包括但不限于使用Java内置的`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`,以及更流行的开源库如Quartz和Spring Scheduler。下面我们将深入探讨...

    spring定时器 Spring定时器的两种实现方式Java的Timer类和OpenSymphony的Quartz。

    Spring框架提供了两种方式来处理定时任务:Java内置的`Timer`类和第三方库OpenSymphony的Quartz。下面将详细介绍这两种实现方式。 ### 1. Java `Timer` 类 Java `java.util.Timer` 类是Java标准库中的一个轻量级...

    web定时器组件

    4. Spring Task:Spring框架内置的定时任务解决方案,包括基于ScheduledExecutorService的简单定时任务和基于Quartz的复杂定时任务。使用@Scheduled注解可以轻松地声明周期性任务。 三、Web定时器组件的实现 1. ...

    定时器quartz的应用

    这篇博客文章“定时器Quartz的应用”很可能深入探讨了如何在实际项目中利用Quartz来实现定时任务的管理。Quartz的核心概念包括作业(Job)、触发器(Trigger)以及调度器(Scheduler),它们共同构成了一个灵活的...

    Quartz 开发指南(附源码)

    - **Web 应用集成**:Quartz 可以与 Spring、Struts 等 Web 框架无缝集成,方便在 Web 环境下使用。 - **分布式调度**:通过集群配置,Quartz 支持多节点间的负载均衡和故障转移。 8. **最佳实践与优化** - **...

    quartz定时器2.2.1JAR包

    Quartz定时器是一款开源的、功能强大的作业调度框架,它为Java应用程序提供了精确且可扩展的任务调度能力。在Java世界中,Quartz以其灵活性、稳定性和广泛的社区支持而备受推崇。2.2.1版本是Quartz的一个稳定版本,...

    quartz-2.2 以及关联jar包

    综上所述,Quartz-2.2及其关联的jar包为Java开发者提供了一个强大且灵活的作业调度解决方案,适用于各种规模的应用场景,从简单的定时任务到复杂的分布式调度。通过理解并熟练掌握其核心概念、新特性和最佳实践,...

    java写定时任务,定时任务、定时器详细示例.pdf

    虽然`Timer`和`TimerTask`满足了基础的定时需求,但在复杂场景下,如需要更精确的控制、任务间的依赖等,可以考虑使用Quartz或Spring框架的定时任务支持,它们提供了更强大的功能和更灵活的配置。 总的来说,Java的...

Global site tag (gtag.js) - Google Analytics