当前位置:   article > 正文

SpringTask执行定时任务中调用方法中断问题_在定时任务重通过抛异常中断任务

在定时任务重通过抛异常中断任务

背景

使用SpringQuartz轻量级定时任务时,出现任务中的方法调用链未执行完,也未抛出异常,然后到下一次时间就继续执行下一次的任务。刚开始时百度一下,以为是线程阻塞、并发设置等(默认是并发执行)。然后顺着这个思路一直往下搜索资料,找到的是线程阻塞,然后不理解为什么阻塞,用了各种方法,包括Java VisualVM监控器来监听Tomcat的线程问题,查看哪些线程waitable;事后证明是我多想了,并没有等待线程,也没有CPU非常高的现象。耐心再debug几次发现有几个异常,可是一直都没有抛出来,直到追踪到一个定时任务线程中的异常信息才发现,是Spring定时任务框架将异常捕获了,导致控制台没有输出。细想定时任务这么设计的原因,否则可能会因为异常原因而导致大量阻塞无法进行下一次定时任务。

过程

  • 原因
    被以下任务调度线程捕获而未打印到控制台。这点可以通过eclipse中的Debug调试在线程栈中找到,运行时主要调用类如下:
    springTask用到的类

  • SpringTask是如何通过注解来@Scheduled来运行定时任务的?
    首先要明白的一点是定时任务都是基于多线程来执行的,如Timer或TimerTask等都是基于多线程的,而在java并发包中有个ScheduledThreadPool是专门用来解决定时任务线程的问题。
    SpringTask执行定时任务的方法是org.springframework.scheduling.support.ScheduledMethodRunnable.ScheduledMethodRunnable类中的run()方法,该类实现了Runnable方法;构造方法与源代码如下:

private final
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/83517
推荐阅读
相关标签
  

闽ICP备14008679号