在 Async 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 请求,让服务端自己想办法实现取消。
这种方法有什么问题吗?