我有一个使用SpringBoot的预定任务,计划星期一到星期五上午10点运行。我正在码头集装箱中运行我的应用程序,我的机器在晚上6点到9点之间暂停。当我启动我的机器时,除非我在预定的时间之前重新启动容器,否则排定了10小时的任务不会运行。我有应用程序日志,当这种情况发生时,在方法中没有使用@Scheduled注释的日志记录。我相信这是个僵局。我想知道是否有任何方法以编程方式检测Springboot中的死锁。
我的Cron表达式:"0 0 10 **MON“
注意:我正在我的机器上进行测试,以便以后在适当的服务器上托管。
发布于 2019-07-23 10:39:46
AFAIK在Java中没有检测系统是否进入备用/hibernate的标准方法。Spring中的调度是基于Java中的计时工具,这些设备不适合在操作系统睡眠或hibernate条件下工作。简而言之,如果JVM无法检测系统何时进入备用状态,Spring也不能。
在我看来,你有以下选择:
例如,如果检测到大于1s的时间差(delta),则以下内容将重新启动上下文:
@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();
}
}
}希望能帮上忙。
https://stackoverflow.com/questions/57147648
复制相似问题