虽然Servlet 3.0规范有 request.startAsync()和 asyncContext.start(), 为什么它没有提供 asyncContext.stop()或 asyncContext.cancel()来启动服务器端的必要清理?
请在其他question的上下文中查看此信息,以了解我的来源。
在这种情况下,如果我有办法清理服务器端(像AsyncListeners这样的servlet容器),而不必调用 asyncContext.complete(),这可能会尝试和将响应发送回客户端,这将是有道理的。不是吗?
答案 0 :(得分:2)
在这种情况下,呼叫1仍然挂在那里,等待呼叫2进入并想要杀死它时的响应。在这种情况下,为什么你不想在通话1上拨打complete()
,从而完成该通话,以便客户端停止等待?您可能希望在此类情况下将状态代码设置为200以外的值,但complete
似乎也是给定任何方案的最佳选项,因为它将控制权返回给原始调用方并执行任何与请求相关的清理工作
当超时发生时,这是一个错误,容器调用complete
(我想象的非200响应代码)。您描述的场景类似于超时(虽然是强制超时),所以为什么不做容器做的事情。在调用complete
之前调用类似的东西:
ac.getResponse().setStatus(500);
任何可能都会在输出流中写一些内容来描述导致此错误的原因。