Процесс ожидания ответа метода без блокировки других HTTP-запросов - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть этот код для метода HTTP GET:

@Override
public Cert get(Representation entity) {
    // ...
    Cert cert = ct.fetchCertificate(Arrays.asList(domains));
    return cert; 
}

Это генератор сертификатов, который возвращает сериализованный объект Cert в клиент.

А внутри метода fetchCertificate есть метод Thread.sleep, который заставляет весь сервлет / веб-приложение останавливаться до тех пор, пока метод не возвращается, в результате чего целое веб-приложение не может отвечать на дополнительные запросы 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) { 
      // ... 
 }

В Rx Java говорится о том, что является наилучшим способом достижения той же функциональности, но без блокировки приложения.

1 Ответ

0 голосов
/ 24 февраля 2020

Вам нужно поместить весь HTTP-запрос вызова и спать в дополнительном потоке. Кажется, он блокирует основной поток.

...