В то время как спецификации сервлетов 3.0 имеет request.startAsync() и asyncContext.start(), почему он не предоставил asyncContext.stop() или asyncContext.cancel() инициировать необходимую очистку на стороне сервера?Почему же нет asyncContext.cancel()
Pls рассматривает это в контексте этого другого question, чтобы понять, откуда я.
- Один запроса HTTP начинает обработку Async и возвращает ссылку .../outstandingRequests/RequestID клиента.
- Другой HTTP вызовы запрос DELETE на эту ссылку, чтобы отменить запрос
В этом случае, если у меня был способ очистить вверх на стороне сервера (сервлет контейнер материал как AsyncListeners), вместо того, чтобы звоните asyncContext.complete(), который, вероятно, попытается отправить ответ клиенту, это будет иметь смысл. Не так ли?
Я беспокоюсь о побочных эффектах вызова complete() в случае отмены: «Любые слушатели типа AsyncListener, зарегистрированные в ServletRequest, для которых был создан этот AsyncContext, будут вызваны по методу onComplete.». Если слушатель должен рассмотреть это как успешное завершение (тривиальный пример: увеличивайте счетчик SuccessfulRequestsHandled), я столкнулся бы с проблемой. Это похоже на перегрузку complete() со многими значениями! – brainOverflow
В вызове onComplete используется AsyncEvent, который позволяет вам получить доступ к HttpServletResponse. В вашем слушателе вы можете проверить код состояния и действовать соответственно, если не 200. Вы также можете создать класс абстрактного слушателя, который инкапсулирует эту проверку и делегирует вместо onError, если код статуса не 200. Тогда просто все ваши пользовательские слушатели простираются от этого. – cmbaxter
Это приемлемое решение! Но это по-прежнему круто! Я думаю, если мы растянем этот аргумент, AsyncListener может просто сделать с одним методом обратного вызова, скажем, onComplete(), а затем потребовать от программиста установить соответствующий код состояния и определить, является ли это тайм-аутом, ошибкой или успехом или отменить! Он может покончить с onTimeout() и onError()! Я честно чувствую, что спецификация Async Servlet не тратила много времени, думая об отмене! – brainOverflow