Este es el código del servlet que desplegué en Jetty:embarcadero servlet no detecta que el cliente se ha desconectado
public class StreamServlet extends HttpServlet
{
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/xml; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
InputStream is = this.getServletContext().getResourceAsStream("A.xml");
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, Charset.forName("UTF-8")));
String line = "";
try
{
while((line = reader.readLine()) != null) {
getServletContext().log(line);
writer.println(line);
writer.flush();
Thread.sleep(1500); // for testing
}
}
catch (InterruptedException e)
{
getServletContext().log("exception",e);
}
}
}
entonces me encontré en la línea de comandos
curl -i http://localhost:8080/foo/servlet
El archivo A.xml
contiene alrededor de 13,000 líneas; para que curl se muestre correctamente en cada línea que recibió después de 1,5 segundos. Luego interrumpí curl, pero para mi sorpresa el servlet continuó funcionando; es decir, en este ciclo while.
while((line = reader.readLine()) != null) {
getServletContext().log(line);
writer.println(line);
writer.flush();
Thread.sleep(1500); // for testing
}
¿Por qué tiene este comportamiento? No estoy usando continuaciones. Estoy ejecutando Jetty 6.1.26. Lo que quiero: el hilo del servlet debe detenerse cuando detecta que el cliente ha terminado la conexión http.