在Java EE环境中暂停/休眠n秒

时间:2014-04-05 09:56:48

标签: java multithreading java-ee thread-sleep workmanagers

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

    }

1 个答案:

答案 0 :(得分:1)

Thread.sleep()最终进行本机操作系统调用。精度受操作系统本身的限制。 JVM无法做到这一点。实际上所有的操作系​​统都有类似睡眠的系统调用,几乎所有的桌面/服务器操作系统都会说,“sleep(n)”会阻止的调用过程至少 n秒/毫秒/纳秒/无论如何。“也就是说,他们可以阻止来电者超过n的任何时间。

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