Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检测计划的SpringBoot任务是否已死锁?_Java_Spring Boot_Docker_Deadlock_Spring Scheduled - Fatal编程技术网

Java 如何检测计划的SpringBoot任务是否已死锁?

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” 注意:我正在我的机器上进行测试,

我有一个使用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,该链接向我指出目标是停止一个计划任务。我想知道是否有可能检测到计划的任务已陷入僵局。