tomcat 不发送分块响应的最后一个块
tomcat does not send last chunk for chunked response
我们正在使用 tomcat 7.0.67,它几乎是 tomcat7 的最新 tomcat 版本。
我们发现在我们 运行 一些性能测试之后, tomcat 没有正确发送分块响应。
它不会发回 "last chunk" ,它应该是零长度。 tomcat 服务器上没有请求时,问题仍然存在。
有人见过这个吗?有解决方法吗?
我找到了原因。我们正在使用异步任务。
在前台线程中,我们在某些情况下调用 ServletOutputStream.flush。
在 tomcat 中,ServletOutputStream.flush 将导致 tomcat 开始计算所需的 tomcat 的 OutputFilter。
IdentityOutputFilter 用于 non-chunk 响应。如果在刷新时设置了 "connection:close" header 或 "content-length",将使用 IdentityOutputFilter。 ChunkedOutputFilter 用于分块响应
但后台线程可能仍在处理和使用 ServletOutputStream。
在某些情况下,这种过早的刷新会使 tomcat 链接 IdentityOutputFilter 和 ChunkedOutputFilter。
tomcat 可能不会出现这种情况,分块响应开始不起作用。
解决方法不是在前台线程中调用刷新,但我相信它仍然是一个 tomcat 错误,因为 tomcat 分块响应不应停止工作,即使 webapp 过早地调用刷新。
我们正在使用 tomcat 7.0.67,它几乎是 tomcat7 的最新 tomcat 版本。 我们发现在我们 运行 一些性能测试之后, tomcat 没有正确发送分块响应。 它不会发回 "last chunk" ,它应该是零长度。 tomcat 服务器上没有请求时,问题仍然存在。 有人见过这个吗?有解决方法吗?
我找到了原因。我们正在使用异步任务。 在前台线程中,我们在某些情况下调用 ServletOutputStream.flush。 在 tomcat 中,ServletOutputStream.flush 将导致 tomcat 开始计算所需的 tomcat 的 OutputFilter。 IdentityOutputFilter 用于 non-chunk 响应。如果在刷新时设置了 "connection:close" header 或 "content-length",将使用 IdentityOutputFilter。 ChunkedOutputFilter 用于分块响应
但后台线程可能仍在处理和使用 ServletOutputStream。 在某些情况下,这种过早的刷新会使 tomcat 链接 IdentityOutputFilter 和 ChunkedOutputFilter。 tomcat 可能不会出现这种情况,分块响应开始不起作用。
解决方法不是在前台线程中调用刷新,但我相信它仍然是一个 tomcat 错误,因为 tomcat 分块响应不应停止工作,即使 webapp 过早地调用刷新。