使用此方法取消/中止异步servlet处理的任何问题

时间:2013-05-01 19:00:03

标签: java rest java-ee servlets servlet-3.0

在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&#39的建议之后)是:

  • 创建" requestId"在服务器上并返回一个URL /链接 第一部分回应的一部分(因为我可以得到 作为异步处理的一部分,单个请求的许多部分响应。)
  • 链接可以是,例如: 的 ... / outstandingRequests /的requestId
  • 当需要取消请求时,客户端会对URL发出DELETE请求,让服务器找出如何取消请求。

这种方法有什么问题吗?

1 个答案:

答案 0 :(得分:1)

在RESTful意义上使用长时间运行的操作/任务时,最好将操作本身视为资源。操作URL的帖子返回一个URL,您可以使用该URL来获取该操作的状态(包括操作完成时的结果),并且对该URL的DELETE将终止操作。