首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测计划中的SpringBoot任务是否已陷入僵局?

如何检测计划中的SpringBoot任务是否已陷入僵局?
EN

Stack Overflow用户
提问于 2019-07-22 13:57:52
回答 1查看 1.1K关注 0票数 1

我有一个使用SpringBoot的预定任务,计划星期一到星期五上午10点运行。我正在码头集装箱中运行我的应用程序,我的机器在晚上6点到9点之间暂停。当我启动我的机器时,除非我在预定的时间之前重新启动容器,否则排定了10小时的任务不会运行。我有应用程序日志,当这种情况发生时,在方法中没有使用@Scheduled注释的日志记录。我相信这是个僵局。我想知道是否有任何方法以编程方式检测Springboot中的死锁。

我的Cron表达式:"0 0 10 **MON“

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

EN

回答 1

Stack Overflow用户

发布于 2019-07-23 10:39:46

AFAIK在Java中没有检测系统是否进入备用/hibernate的标准方法。Spring中的调度是基于Java中的计时工具,这些设备不适合在操作系统睡眠或hibernate条件下工作。简而言之,如果JVM无法检测系统何时进入备用状态,Spring也不能。

在我看来,你有以下选择:

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

例如,如果检测到大于1s的时间差(delta),则以下内容将重新启动上下文:

代码语言:javascript
复制
@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();

    }
  }
}

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57147648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档