当前位置: 首页 > 知识库问答 >
问题:

Spring调度程序意外停止

庄欣然
2023-03-14

我们在Tomcat 6上有一个Spring 3 Web应用程序,它通过@Sched(主要用于每天晚上运行的作业)使用了几个计划服务。现在看来,有时(很少,也许是两个月左右一次)调度程序线程会停止工作,因此在接下来的晚上不会执行任何作业。在我们的日志文件中没有异常或日志条目。

有人知道为什么会发生这种情况吗?或者如何获得关于这个问题的更多信息?

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

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

共有3个答案

贺俊楚
2023-03-14

在我的例子中,堆栈跟踪是绝对干净的,线程只启动了几次,仅此而已。问题与另一个计划相冲突。

已更新

计划不能正常工作,因为我使用了fixedDelayString,并且上一个作业在开始新作业时没有结束。将调度更改为fixedRateString后,线程正确启动。

空枫涟
2023-03-14

这很容易找到。您可以使用堆栈跟踪来执行此操作。有许多帖子介绍了如何获取堆栈跟踪,在unix系统上,您可以执行“kill-3”,堆栈跟踪显示在catalina中。输出日志文件。

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

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

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

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

宫铭
2023-03-14

既然这个问题得到了这么多的投票,我将发布我的问题的解决方案(可能非常具体)。

我们正在使用Apache HttpClient库调用调度作业中的远程服务。遗憾的是,在执行请求时没有设置默认超时。设置后

connectTimeout
connectionRequestTimeout
socketTimeout

到了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();
 类似资料:
  • 我需要根据参数中提供的数字(n)执行特定的spring boot应用程序n次。我正在使用spring boot,并考虑使用spring调度程序来实现这一点。spring scheduler可以用来调度一个任务4-5次,然后停止吗? 我需要有一个单独的日志文件,为每个实例生成的输出文件。

  • 2019-07-03 13:27:50 0[注]InnoDB:128个回滚段中有128个处于活动状态。 2019-07-03 13:27:50 0“错误”INNODB:页面[页面ID:space=0,页面编号=305]日志序列号2834539在未来!当前系统日志序列号1604011。 2019-07-03 13:27:50 0[错误]InnoDB:您的数据库可能已损坏,或者您复制了InnoDB表空

  • 我有两个方法可以与spring调度器定期运行,一个是@schedule(fixedrate=300000)--每5分钟运行一次,另一个是@schedule(cron=“0 0 0 2**?)--每天凌晨2点运行。我们没有使用线程池的taskScheduler,所以它只使用一个线程,所以没有重叠。 我观察到的是,当5分钟的作业花费更多的时间(比如>30分钟)时,它不允许其他@scheduled作业运

  • 我在应用程序中为2个不同的包配置了Spring AOP来记录异常。每个封装有2种不同的配置: } method2中出现了一些异常,它调用了logExceptionXYZ方法,我们将它包装在一个泛型异常中,比如ExceptionXYZ,并进一步抛出它。 但在此之后,logExceptionABC方法也会被调用并抛出一个泛型异常,例如ExceptionABC。

  • 乡亲们, 我正在尝试用Quartz调度器实现Spring boot,以便在java中调度作业。我的经理建议根据作业id为所有作业使用具有不同实施服务的单个作业。但我不能说服所有服务实施都使用单个作业。 请指导我使用多个服务类的单个作业或为每个服务编写每个作业。 提前感谢。。

  • 我有两个要求。 每周一触发作业 对于第一个要求,我尝试了和。他们俩都不工作。该函数未被调用。 对于第二个要求,我尝试了和。我得到下面的错误。 原因:java。lang.IllegalStateException:遇到无效的@Scheduled方法“monthlyData”:用于输入字符串:“2#1”。