用fixedRate调度的spring 3似乎在某一点后意外停止执行,如何调试?

时间:2014-02-10 11:06:32

标签: java multithreading spring spring-mvc scheduled-tasks

我在Spring 3.2.4 Web应用程序中有一个计划任务,计划以1分钟的fixedRate运行。大约一天之后,任务就会停止执行,但是它何时会发生,因此我无法在我的开发环境中重现这一点。

我尝试收集一个线程转储,在这种情况发生之后就知道它停止了,但是,如果我正确地解释了线程转储,那么我的代码中的线程就不会被阻塞。

线程转储输出的示例如下所示(对于线程池中的每个线程都有类似的转储):

Thread 5510: (state = BLOCKED)
 - sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
 - java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) @bci=20, line=196 (Compiled frame)
 - java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) @bci=68, line=2025 (Compiled frame)
 - java.util.concurrent.DelayQueue.take() @bci=57, line=164 (Compiled frame)
 - java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=4, line=609 (Interpreted frame)
 - java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=1, line=602 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor.getTask() @bci=78, line=947 (Compiled frame)
 - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=18, line=907 (Compiled frame)
 - java.lang.Thread.run() @bci=11, line=662 (Interpreted frame)

对我来说,这看起来很正常 - 线程在池中等待。

我的问题是如何进一步调试?有没有办法以某种方式访问​​和转储有关运行时弹簧调度状态的信息(例如,下一个执行时间,上次执行时间,哪些作业正在执行,线程池中有多少可用线程等等。)?

1 个答案:

答案 0 :(得分:1)

再次进行线程转储后,在问题发生后立即发现原因 - 计划任务在某些条件下可能发生无限循环。

为了将来参考线程转储采用:

jstack [process id] > threaddump.txt

我设法解决了这个问题,虽然我仍然不太明白为什么问题无限循环没有出现在问题发生几个小时后的线程转储中。