【发布时间】:2011-07-08 16:54:12
【问题描述】:
这是我部署到 Jetty 的 servlet 的代码:
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);
}
}
}
然后我在命令行上运行
curl -i http://localhost:8080/foo/servlet
文件A.xml 包含大约13,000 行;所以 curl 正确显示了它在 1.5 秒后收到的每一行。然后我中断了 curl,但令我惊讶的是 servlet 继续运行;即在这个while循环中。
while( (line = reader.readLine()) != null ) {
getServletContext().log( line );
writer.println( line );
writer.flush();
Thread.sleep( 1500 ); // for testing
}
为什么它会表现出这种行为?我没有使用延续。我正在运行 Jetty 6.1.26。我想要的是:当 servlet 线程检测到客户端已终止 http 连接时,它应该停止。
【问题讨论】: