我在 WebLogic 上部署了 Web 应用程序。此 Web 应用程序有一个 servlet,它尝试连接到数据库,如果失败,它将等待/暂停/睡眠一段时间并尝试再次连接到数据库。(实际上它会等待并尝试 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) {…}
}