Я попытался написать в ответ, потому что нет правильного обратного вызова разъединения:
private boolean write(byte[] output, AsyncContext context) {
try {
OutputStream stream = context.getResponse().getOutputStream();
stream.write(output);
stream.flush();
return true;
} catch (IOException ex) {
//client disconnected
log.error(ex);
removeAsyncContext(context);
return false;
}
}
Но это не похоже на хитрость. Когда клиент отключен, запись и очистка буфера не привели к исключению .
Странно то, что при второй попытке записи в выходной поток (после отключения) запись вызывает исключение. Похоже, что в первый раз, когда вы пишете / очищаете его, какое-то внутреннее состояние устанавливается на ошибку, без уведомления.
Я пробовал на Jetty 8 и Tomcat 7, и я вижу то же самое поведение.
Есть ли решение, чтобы узнать, получено ли сообщение клиентом? Я что-то пропустил?