gpt4 book ai didi

java - 如何检测SpringBoot定时任务是否已经死锁?

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:26 25 4
gpt4 key购买 nike

我有一个使用 SpringBoot 的计划任务,计划在周一至周五上午 10 点运行。我正在 Docker 容器中运行我的应用程序,我的机器从下午 6 点到上午 9 点整夜暂停。当我启动计算机时,计划 10 小时的任务不会运行,除非我在计划时间之前重新启动容器。我有应用程序日志,当发生这种情况时,带有 @Scheduled 注释的方法内部不会发生日志记录。我相信这是一个僵局。我想知道是否有任何方法可以以编程方式检测 Springboot Scheduled 中的死锁。

我的 Cron 表达式:“0 0 10 * * MON-FRI”

注意:我正在我的计算机上进行测试,以便稍后在适当的服务器上托管。

最佳答案

据我所知,Java 中没有标准方法来检测系统是否进入待机/hibernate 状态。 Spring 中的调度基于 Java 中的计时工具,这些工具不适合在操作系统 sleep 或 hibernate 条件下工作。简而言之,如果 JVM 无法检测到系统何时进入待机状态,Spring 也无法检测到。

据我所知,您有以下选择:

  • 系统恢复时通知应用程序,然后重新安排任务。这是可能的solution围绕 Ubuntu 上的 pm utils 构建。 This one适用于 Windows。
  • 添加一个额外的任务,例如每 10 秒运行一次并读取系统时间。如果两个时间读数之间存在明显差异,则意味着您的系统进入休眠状态然后又恢复。

例如,如果检测到时间间隔 (delta) 大于 1 秒,则以下示例将重新启动上下文:

@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();

}
}
}

希望有帮助。

关于java - 如何检测SpringBoot定时任务是否已经死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57147648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com