В общем случае, если веб-сервер 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
будет ожидать события, чтобы отправить все ответы всем клиентам.
Мой вопрос таков: как сервлет может заставить всех клиентов сохранять соединение и ждать ответа без открытия каких-либо потоков?