gpt4 book ai didi

java - Jetty servlet 未检测到客户端已断开连接

转载 作者:搜寻专家 更新时间:2023-11-01 00:58:24 25 4
gpt4 key购买 nike

这是我部署到 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 连接时应该停止。

最佳答案

我看不出你从哪里得到 writer,所以我假设它来自 response.getWriter()。

我认为可能发生的情况是 Jetty 在将响应发送到客户端之前在内部对其进行缓冲。它需要这样做是因为它需要计算响应的大小,以便它可以在 HTTP 响应 header 中设置“Content-Length”字段。这是客户需要的,所以它知道要读多少。 (好吧,这并不是真正必需的,但那是另一个讨论。)

我认为 Jetty 在您关闭 writer 之前不会真正发送数据。我也在想 flush() 不会做任何事情,因为它在知道没有更多数据到来之前无法发送任何数据。当您写入此缓冲流时,它不会检查连接是否仍处于 Activity 状态。

为你的循环试试这个:

for(String line = reader.readLine(); line != null && !writer.checkError(); line = reader.readLine()) {
getServletContext().log( line );
writer.println( line );
writer.flush();
Thread.sleep( 1500 ); // for testing
}

我在想也许 writer.checkError() 传播到实际的套接字输出流并检查它是否仍然打开。

编辑 1:嗯,没关系,我错过了您所说的 flush() 正在向 curl 发送数据的地方。尽管如此,请在您的循环中尝试 checkError() 并让我知道它是否有效。

关于java - Jetty servlet 未检测到客户端已断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5192087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com