在异步servlet处理场景中,我想实现请求的取消。 (我也希望保持这种 Restful )
比如说,我有这样的代码:
@RequestMapping("/quotes")
@ResponseBody
public void quotes() {
//...
final AsyncContext ac = request.startAsync();
ac.setTimeout(0);
RunJob job = new RunJob(ac);
asyncContexts.add(job);
pool.submit(job);
};
// In some other application-managed thread with a message-driven bean:
public void onMessage(Message msg) {
//...
if (notEndOfResponse) {
ServletOutputStream out = ac.getResponse().getOutputStream();
//...
out.print(message);
} else {
ac.complete();
asyncContexts.remove(ac);
}
};
如果客户端决定在服务器端取消此处理,它需要发送另一个 HTTP 请求来标识先前的请求,然后服务器取消先前的请求(即停止服务器端)处理该请求并完成其响应)。
有标准方法可以做到这一点吗? 如果没有标准的方法来做到这一点,并且每个开发人员都根据自己的意愿和技能来做到这一点,我想知道我解决这个问题的(简单的)方法是否可以。 我的方法(根据@Pace的建议)是:
- 在服务器上创建一个“requestId”并返回一个 URL/链接: 第一部分响应的一部分(因为我可以获得 作为异步处理的一部分,单个请求的许多部分响应)。
- 链接可以是,例如: .../outstandingRequests/requestId
- 当需要取消请求时,客户端会对 URL 发出 DELETE 请求,并让服务器在最后决定如何实现取消。
这种方法有什么问题吗?
最佳答案
在 RESTful 意义上使用长时间运行的操作/任务时,最好将操作本身视为资源。发送到操作 URL 会返回一个 URL,您可以使用该 URL 来获取该操作的状态(包括操作完成时的结果),并且删除该 URL 将终止该操作。
关于java - 这种取消/中止异步 servlet 处理的方法存在任何问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16324553/