1

虽然 Servlet 3.0 规范有request.startAsync()asyncContext.start(),但为什么它没有提供asyncContext.stop()asyncContext.cancel()来在服务器端启动必要的清理?

请在另一个问题的背景下查看这一点,以了解我来自哪里。

  • 一个 HTTP 请求启动异步处理并向客户端返回一个 .../outstandingRequests/requestId链接。
  • 另一个 HTTP 请求在该链接上调用 DELETE 以取消请求

在这种情况下,如果我有办法清理服务器端(servlet 容器,如 AsyncListeners),而不必调用可能会尝试将响应发送回客户端的asyncContext.complete(),它将说得通。不是吗?

4

1 回答 1

2

在这种情况下,呼叫 1 仍然挂在那里,等待呼叫 2 进来并想要杀死它时的响应。在这种情况下,您为什么不想complete()在呼叫 1 上进行呼叫,从而完成该呼叫以使客户端停止等待?在这种情况下,您可能希望将状态代码设置为 200 以外的值,但complete考虑到任何情况,这似乎也是最佳选择,因为它将控制权返回给原始调用者并执行任何与请求相关的清理工作。

当超时发生时,这是一个错误,容器调用complete(我想一个非 200 响应代码)。您描述的场景类似于超时(尽管是强制超时),所以为什么不做与容器相同的事情。在调用之前调用这样的东西complete

ac.getResponse().setStatus(500);

任何人都可能向输出流写入一些内容,描述导致此错误的原因。

于 2013-05-03T19:40:14.513 回答