Для асинхронного программирования Джерси (JAX-RS) обеспечивает обратный вызов ConnectionCallback
, который должен быть выполнен, когда соединение нарушено. Из docs:
Поскольку некоторые асинхронные запросы могут занять много времени для обработки клиента, принять решение о прекращении подключения к серверу до ответа был возобновлен или до того, как он был полностью написан клиенту. к обратитесь к этим случаям использования ConnectionCallback. Эта обратный вызов будет выполнен только в том случае, если соединение было преждевременным завершено или утеряно, когда ответ записывается обратно клиент. Обратите внимание, что этот обратный вызов не будет вызываться, если ответ и клиентское соединение закрыто, как ожидалось.
Звучит здорово, но я никогда не смогу его запустить.
Вот код:
@GET
@Produces(MediaType.TEXT_PLAIN)
@ManagedAsync
@Path("/poll")
public void poll(@Suspended final AsyncResponse asyncResponse) {
asyncResponse.register(new CompletionCallback() {
@Override
public void onComplete(Throwable throwable) {
logger.info("onComplete called.");
}
});
asyncResponse.register(new ConnectionCallback() {
@Override
public void onDisconnect(AsyncResponse disconnected) {
logger.info("onDisconnect called.");
}
});
asyncResponse.setTimeout(POLL_TIMEOUT_SECONDS, TimeUnit.SECONDS);
asyncResponse.setTimeoutHandler(new TimeoutHandler() {
@Override
public void handleTimeout(AsyncResponse asyncResponse) {
logger.info("handleTimeout called.");
asyncResponse.resume(Response.status(Response.Status.OK).entity("TIMEOUT").build());
}
});
}
Два других обратных вызова, показанные CompletionCallback и TimeoutHandler, срабатывают нормально, без сбоев. Если заданная продолжительность таймаута достигнута, срабатывает TimeoutHandler. Если экземпляр AsyncResponse возобновлен, завершается завершение CompletionCallback.
Однако, с ConnectionCallback, я могу закрыть, убить или иным образом остановить клиента, который сидит подключен к веб-службе, показанной выше, и ConnectionCallback никогда не запускается.
Я что-то упустил? Включен ли ConnectionCallback в Джерси? (Это необязательно в спецификации JAX-RS, но документы в Джерси говорят об этом, как будто это реализовано.)
Любой ввод будет оценен.