У меня есть сервлет, который долго обрабатывает запрос. Предполагается, что вы будете продолжать делать что-то в цикле внутри doPost и отправлять данные через устройство записи ответа. По сути, это постоянное добавление данных в клиентский браузер. Но проблемы возникают, когда клиент просто закрывает браузер. Несмотря на разорванное соединение, поток записи ответа в сервлете никогда не закрывается, поэтому сервлет не знает о нарушении соединения и продолжает сбрасывать данные в модуль записи без каких-либо ошибок. Как это возможно? И как обнаружить и отменить длительную обработку запросов в случае отключения браузера?
Я думаю, что checkError() в авторе ответа должен помочь, но это не сработает. Есть идеи, почему?
Это код сервлета, который никогда не останавливается:
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
HttpSession session = request.getSession();
System.out.println("Session " + session.getId() + " started");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try
{
while (!out.checkError())
{
try
{
Thread.sleep(1000);
} catch (InterruptedException ex)
{
ex.printStackTrace();
}
Date date = new Date();
// TODO append output to the client browser here
out.println(".....");
System.out.println("Session " + session.getId() + "data sent at: " + date);
out.flush();
//break; // _TEST
}
} finally
{
System.out.println("Session " + session.getId() + " finished");
out.close();
}
}
Спасибо,
Майк