Java 用于在不阻止其他HTTP请求的情况下等待方法响应的进程

Java 用于在不阻止其他HTTP请求的情况下等待方法响应的进程,java,servlets,concurrency,rx-java,rx-java2,Java,Servlets,Concurrency,Rx Java,Rx Java2,我有一个HTTP GET方法的代码: @Override public Cert get(Representation entity) { // ... Cert cert = ct.fetchCertificate(Arrays.asList(domains)); return cert; } 它是一个证书生成器,将序列化的Cert对象返回到客户端 在fetchCertificate方法中有一个Thread.sleep方法,该方法会导致整个servlet/web应用

我有一个HTTP GET方法的代码:

@Override
public Cert get(Representation entity) {
    // ...
    Cert cert = ct.fetchCertificate(Arrays.asList(domains));
    return cert; 
}
它是一个证书生成器,将序列化的
Cert
对象返回到客户端

fetchCertificate
方法中有一个
Thread.sleep
方法,该方法会导致整个servlet/web应用程序停止,直到该方法返回,从而导致整个web应用程序无法响应其他HTTP请求:

// Poll for the challenge to complete.
try {
       int attempts = 20;
       while (challenge.getStatus() != Status.VALID && attempts-- > 0) {
       LOG.info("CHALLENGE ATTEMPTS: " + attempts);
       // Did the authorization fail?
       if (challenge.getStatus() == Status.INVALID) {
          throw new AcmeException("Challenge failed... Giving up.");
       }

       // Wait for a few seconds
       Thread.sleep(5000L);

       // Then update the status
       challenge.update();
     }
 } catch(Exception e) { 
      // ... 
 }

用RxJava术语来说,实现相同功能但不阻塞应用程序的最佳方法是什么

您需要将整个HTTP请求调用和睡眠放在一个辅助线程中。它似乎阻塞了主线程。

撇开主要问题不谈,我想知道,仅仅因为一个线程休眠,整个web应用程序将如何停止。应用程序是单线程的吗?我正在使用运行在NGINX单元上的Restlet框架,我也想知道为什么会发生这种情况。web应用程序工作正常,可以使用HTTP方法,但当使用
Thread.sleep
的此方法被触发时,直到它完成任何HTTP请求(等待或超时)。可能需要配置web容器使用的线程池的大小。如果它使用单个线程,那就太糟糕了(对于servlet应用程序)。对我来说,这是这里需要的第一个改变。除此之外,您可能需要为
challenge.update()
或此方法使用或创建一个异步API,以便web容器线程不会在等待执行时陷入困境。方法
public Cert get(表示实体)
是实际的HTTP请求方法。不确定“放置整个HTTP请求”的意思,一种方法是创建一个从线程继承的单独类,并调用这个get。。。方法如果此
fetchCertificate
阻止web应用程序被阻止,则会发生相同的情况