Как асинхронный сервлет может поддерживать связь с http-клиентами, не открывая больше потоков - PullRequest
0 голосов
/ 11 июня 2018

В общем случае, если веб-сервер java хочет обслуживать (Jetty, ...) несколько запросов, сервер должен открывать поток для каждого запроса.А если у вас большое количество запросов, вы должны поместить поток в пул, чтобы сервер работал без перебоев.Недостатком этого способа является то, что сервер потребляет много ресурсов, и клиенту приходится ждать в очереди пула потоков.
Поэтому некоторые более новые версии Jetty поддерживают асинхронный сервлет, который позволяет серверу сохранять информацию обо всех запросах безсохранение потоков в ожидании события, чтобы отправить ответ клиенту.Вы можете узнать по этой ссылке
У меня есть несколько строк кода:

public class AsyncServlet extends HttpServlet implements OnEventCome {

List<AsyncContext> listContext = new ArrayList<>();

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    AsyncContext ctxt = req.startAsync();
    ctxt.setTimeout(3600000l);
    synchronized (listContext) {
        listContext.add(ctxt);
    }
}

@Override
public void onEventCome() {
    synchronized (listContext) {
        for (AsyncContext ctxt: listContext) {
            ctxt.start(new Runnable() {
                @Override
                public void run() {
                    ctxt.complete();
                }
            });
        }
        listContext.clear();
    }
}
}

Функция doPost получает информацию о запросе клиента и немедленно завершает работу.Событие onEventCome будет ожидать события, чтобы отправить все ответы всем клиентам.
Мой вопрос таков: как сервлет может заставить всех клиентов сохранять соединение и ждать ответа без открытия каких-либо потоков?

1 Ответ

0 голосов
/ 11 июня 2018

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

Ссылка, которую вы предоставили, дает ответ в последнем разделе, у меня естьдобавлен акцент:

Асинхронная обработка запросов

В API Jetty Continuation (и в асинхронном сервлете 3.0) внесено изменение в API сервлета, которое позволяет запросуотправить несколько раз в сервлет. Если сервлет не имеет ресурсов, необходимых для отправки, то запрос приостанавливается (или переводится в асинхронный режим) , так что сервлет может вернуться из отправки без отправки ответа. Когда ожидаемые ресурсы становятся доступными , запрос повторно отправляется сервлету с новым потоком и генерируется ответ.

...