Spring Scheduler意外停止

obe*_*ker 40 java spring tomcat scheduled-tasks

我们在Tomcat 6上有一个Spring 3 Web应用程序,它通过多个预定服务@Scheduled(主要用于每晚运行的作业).现在似乎有时(很少,也许在两个月左右)调度程序线程停止工作,因此在第二天晚上不会执行任何作业.我们的日志文件中没有异常或日志记录条目.

有人知道为什么会这样吗?或者如何获得有关此问题的更多信息?

有没有办法在应用程序中检测这种情况并重新启动调度程序?

目前,我们通过每5分钟运行一次日志记录作业并创建日志条目来解决此问题.如果日志文件停止更新(由nagios监视),我们知道是时候重启tomcat了.在没有完全重启服务器的情况下重启作业会很不错.

obe*_*ker 17

由于这个问题获得了如此多的选票,我将发布我的问题的(可能是非常具体的)解决方案.

我们使用Apache HttpClient库来调用预定作业中的远程服务.不幸的是,执行请求时没有设置默认超时.设定后

connectTimeout
connectionRequestTimeout
socketTimeout
Run Code Online (Sandbox Code Playgroud)

到30秒问题就消失了.

int timeout = 30 * 1000; // 30 seconds
RequestConfig requestConfig = RequestConfig.custom()
        .setConnectTimeout(timeout)
        .setConnectionRequestTimeout(timeout)
        .setSocketTimeout(timeout).build();
HttpClient client = HttpClients.custom()
        .setDefaultRequestConfig(requestConfig).build();
Run Code Online (Sandbox Code Playgroud)

  • 我正面临着使用Apache HttpClient的完全相同的问题....你,我的朋友,是一位绅士和学者! (3认同)

小智 5

这很容易找到。您将通过堆栈跟踪来完成此操作。有很多关于如何获取堆栈跟踪的帖子,在 unix 系统上,您执行“kill -3”,堆栈跟踪将出现在 catalina.out 日志文件中。

获得堆栈跟踪后,找到调度程序线程并查看它正在做什么。它正在执行的任务是否有可能被卡住?

您还可以在此处发布堆栈跟踪以获得更多帮助。

重要的是要知道您使用什么调度程序。如果您使用 SimpleAsyncTaskExecutor,它将为每个任务启动一个新线程,并且您的调度永远不会失败。但是,如果您有未完成的任务,最终将耗尽内存。

http://docs.spring.io/spring/docs/3.0.x/reference/scheduling.html