0

我在 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) {…}

    }
4

1 回答 1

1

Thread.sleep() 最终进行本机操作系统调用。精度受操作系统本身的限制。JVM 对此无能为力。几乎所有操作系统都有一个类似睡眠的系统调用,几乎所有桌面/服务器操作系统都说类似“sleep(n)”将阻塞调用进程至少n 秒/毫秒/纳秒/任何东西。”也就是说,他们可以阻止调用者超过 n 的任何时间。

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

于 2014-04-05T18:15:24.833 回答