Spring 引导调度程序线程随机停止
Spring Boot scheduler thread stops randomly
我在 spring 启动时有一个调度程序,它每 X 分钟完成一次特定的业务任务。它工作正常,直到它突然停止并且不再参与。日志或任何其他日志中没有异常。我需要重新启动程序才能使调度程序再次工作。
有时候调度器的任务出错了,我抛出异常。为了能够专门处理这些异常,我在 Spring 中为调度程序编写了一个自定义 ErrorHandler,它解决了一个单独的任务以进行日志记录。它已正确链接到调度程序并处理任务。
当在 ErrorHandler 中抛出未处理的异常时,可能会出现此问题。我不确定具体细节,但是 ErrorHandler(或其内部的方法)抛出的运行时异常在其外部传播基本上会杀死该任务的计划线程。此外,没有任何内容写入日志(没有异常消息,nada)。
解决此问题的 "easiest" 方法是将整个方法包装在一个 try/catch 块中以捕获异常 - 虽然取决于 为什么 你有那个可能不是个好主意的错误处理程序。这并没有解决手头的根本问题,但它使线程保持活动状态并允许您记录问题。
示例:
public class MyErrorHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
try {
//handle intended exception (ex. write to database or logs)
} catch (Exception e) {
//handle exception that was thrown while trying to handle the intended exception.
}
}
我在 spring 启动时有一个调度程序,它每 X 分钟完成一次特定的业务任务。它工作正常,直到它突然停止并且不再参与。日志或任何其他日志中没有异常。我需要重新启动程序才能使调度程序再次工作。
有时候调度器的任务出错了,我抛出异常。为了能够专门处理这些异常,我在 Spring 中为调度程序编写了一个自定义 ErrorHandler,它解决了一个单独的任务以进行日志记录。它已正确链接到调度程序并处理任务。
当在 ErrorHandler 中抛出未处理的异常时,可能会出现此问题。我不确定具体细节,但是 ErrorHandler(或其内部的方法)抛出的运行时异常在其外部传播基本上会杀死该任务的计划线程。此外,没有任何内容写入日志(没有异常消息,nada)。
解决此问题的 "easiest" 方法是将整个方法包装在一个 try/catch 块中以捕获异常 - 虽然取决于 为什么 你有那个可能不是个好主意的错误处理程序。这并没有解决手头的根本问题,但它使线程保持活动状态并允许您记录问题。
示例:
public class MyErrorHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
try {
//handle intended exception (ex. write to database or logs)
} catch (Exception e) {
//handle exception that was thrown while trying to handle the intended exception.
}
}