我在WebLogic上部署了Web应用程序。此Web应用程序有一个servlet,它尝试连接到DB,如果失败,它将等待/暂停/休眠一段配置的时间,并尝试再次连接到DB。 (实际上它将等待并尝试N次,指数级,如果所有尝试都失败,它将返回FAILURE响应)。
为了在两次尝试之间等待/暂停,我使用了
Thread.sleep();
但是在运行8个weblogic托管服务器的生产环境中,我发现Thread.sleep()不可靠。它睡眠时间超过配置的时间。
这有什么解决方法吗?
更新
这是我的代码。请注意,我是通过托管服务器活动来调用它的。
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) {…}
}
答案 0 :(得分:1)
Thread.sleep()最终进行本机操作系统调用。精度受操作系统本身的限制。 JVM无法做到这一点。实际上所有的操作系统都有类似睡眠的系统调用,几乎所有的桌面/服务器操作系统都会说,“sleep(n)”会阻止的调用过程至少 n秒/毫秒/纳秒/无论如何。“也就是说,他们可以阻止来电者超过n的任何时间。
有一类称为实时操作系统(RTOS)的操作系统可以提供更好的保证。如果您确实需要精确控制程序的实时行为,那么您可能需要在RTOS上运行它。