Java 如何检测计划的SpringBoot任务是否已死锁?
我有一个使用SpringBoot的计划任务,计划在周一到周五上午10点运行。 我在docker容器中运行我的应用程序,我的机器从晚上6点到早上9点被暂停。 启动计算机时,计划了10小时的任务不会运行,除非在计划时间之前重新启动容器。 我有应用程序日志,发生这种情况时,在带有@Scheduled注释的方法内没有日志记录。 我认为这是一个僵局。 我想知道是否有任何方法可以通过编程方式检测Springboot中的死锁 我的Cron表达式:“0 10**MON-FRI”Java 如何检测计划的SpringBoot任务是否已死锁?,java,spring-boot,docker,deadlock,spring-scheduled,Java,Spring Boot,Docker,Deadlock,Spring Scheduled,我有一个使用SpringBoot的计划任务,计划在周一到周五上午10点运行。 我在docker容器中运行我的应用程序,我的机器从晚上6点到早上9点被暂停。 启动计算机时,计划了10小时的任务不会运行,除非在计划时间之前重新启动容器。 我有应用程序日志,发生这种情况时,在带有@Scheduled注释的方法内没有日志记录。 我认为这是一个僵局。 我想知道是否有任何方法可以通过编程方式检测Springboot中的死锁 我的Cron表达式:“0 10**MON-FRI” 注意:我正在我的机器上进行测试,
注意:我正在我的机器上进行测试,以便稍后在适当的服务器上运行。AFAIK在Java中没有标准的方法来检测系统是否处于待机/休眠状态。Spring中的调度基于Java中的计时工具,这些工具不打算跨操作系统睡眠或休眠条件工作。简而言之,如果JVM无法检测到系统何时进入待机状态,那么Spring也无法检测到 在我看来,您有以下选择:
- 系统恢复时通知应用程序,然后重新安排任务。这可能是围绕Ubuntu上的pm UTIL构建的。这是给Windows的李>
- 添加一个额外的任务,例如每10秒运行一次并读取系统时间。如果两个时间读数之间存在明显差异,则表示系统进入睡眠状态,然后恢复
delta
)大于1s,则以下示例将重新启动上下文:
@SpringBootApplication
@EnableScheduling
public class Application {
private static ConfigurableApplicationContext context;
public static void main(String[] args) {
context = SpringApplication.run(Application.class, args);
}
static LocalTime lastDetectedTime;
static long delta = 1000;
static final long CHECK_INTERVAL = 5000;
@Scheduled(fixedDelay = CHECK_INTERVAL, initialDelay = CHECK_INTERVAL)
public static void restartIfTimeMismatch() {
if(lastDetectedTime == null) {
lastDetectedTime = LocalTime.now();
}
LocalTime currentTime = LocalTime.now();
long diff = Duration.between(lastDetectedTime, currentTime).toMillis();
lastDetectedTime = currentTime;
if(diff > CHECK_INTERVAL + delta) {
Thread thread = new Thread(() -> {
context.close();
context = SpringApplication.run(Application.class);
});
lastDetectedTime = null;
thread.setDaemon(false);
thread.start();
}
}
}
希望能有帮助 AFAIK在Java中没有检测系统是否处于待机/休眠状态的标准方法。Spring中的调度基于Java中的计时工具,这些工具不打算跨操作系统睡眠或休眠条件工作。简而言之,如果JVM无法检测到系统何时进入待机状态,那么Spring也无法检测到 在我看来,您有以下选择:
- 系统恢复时通知应用程序,然后重新安排任务。这可能是围绕Ubuntu上的pm UTIL构建的。这是给Windows的李>
- 添加一个额外的任务,例如每10秒运行一次并读取系统时间。如果两个时间读数之间存在明显差异,则表示系统进入睡眠状态,然后恢复
delta
)大于1s,则以下示例将重新启动上下文:
@SpringBootApplication
@EnableScheduling
public class Application {
private static ConfigurableApplicationContext context;
public static void main(String[] args) {
context = SpringApplication.run(Application.class, args);
}
static LocalTime lastDetectedTime;
static long delta = 1000;
static final long CHECK_INTERVAL = 5000;
@Scheduled(fixedDelay = CHECK_INTERVAL, initialDelay = CHECK_INTERVAL)
public static void restartIfTimeMismatch() {
if(lastDetectedTime == null) {
lastDetectedTime = LocalTime.now();
}
LocalTime currentTime = LocalTime.now();
long diff = Duration.between(lastDetectedTime, currentTime).toMillis();
lastDetectedTime = currentTime;
if(diff > CHECK_INTERVAL + delta) {
Thread thread = new Thread(() -> {
context.close();
context = SpringApplication.run(Application.class);
});
lastDetectedTime = null;
thread.setDaemon(false);
thread.start();
}
}
}
希望能有帮助 请参阅@user7294900,该链接向我指出目标是停止计划的任务。我想知道是否有可能检测到一个计划任务已经死锁。在这个链接中,请参阅@user7294900,该链接向我指出目标是停止一个计划任务。我想知道是否有可能检测到计划的任务已陷入僵局。