gpt4 book ai didi

java - 在 Java EE 环境中暂停/ sleep n 秒

转载 作者:行者123 更新时间:2023-12-01 13:10:54 25 4
gpt4 key购买 nike

我在 WebLogic 上部署了 Web 应用程序。此 Web 应用程序有一个 servlet,它尝试连接到数据库,如果失败,它将等待/暂停/ sleep 一段配置的时间,然后尝试再次连接到数据库。 (实际上它会等待并尝试N次,呈指数级增长,如果所有尝试都失败,它将返回FAILURE响应)。

为了在两次尝试之间等待/暂停,我使用了

Thread.sleep();

但是在运行8个weblogic托管服务器的生产环境中,我发现Thread.sleep()并不可靠。它的 sleep 时间超过了配置的时间。

有什么解决办法吗?

更新:

这是我的代码。请注意,我是从托管服务器 enlivenment 中调用此函数的。

public final void checkDBHealth() throws Throwable {

for (int attempt=0; attempt<BACK_OFF_MAX_ATTEMPTS; attempt++) {
try {
pauseExponentially(attempt);
connect();
execute();
close();
return;
} catch (final Throwable th) {
if (ExceptionType.NON_RETRIABLE == ExceptionAnalyzer.translate(th) || (BACK_OFF_MAX_ATTEMPTS-1) == attempt) {
throw th;
// If exception is thrown I send the failure message
}
}
}

}




private void pauseExponentially(final int attempt) {
if (attempt == 0) {
return;
}

final long delay = (long) (((int)Math.pow(BACK_OFF_BASE, attempt)) * THOUSAND);
try {
Thread.sleep(delay);
} catch (IE e) {…}

}

最佳答案

Thread.sleep() 最终进行 native 操作系统调用。精度受到操作系统本身的限制。 JVM 对此无能为力。几乎所有操作系统都有类似 sleep 的系统调用,并且几乎所有桌面/服务器操作系统都会说“ sleep (n)”之类的内容将阻止调用进程至少 n 秒/毫秒/纳秒/无论如何。”也就是说,他们可以阻止调用者超过 n 的任意时间。

有一类称为实时操作系统 (RTOS) 的操作系统可以提供比这更好的保证。如果您确实需要精确控制程序的实时行为,那么您可能需要在 RTOS 上运行它。

关于java - 在 Java EE 环境中暂停/ sleep n 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22879321/

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