【问题标题】:Any problems with this approach to cancel/abort Async servlet processing这种取消/中止异步 servlet 处理的方法的任何问题
【发布时间】:2013-04-25 19:53:48
【问题描述】:

在 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 请求,并让服务器在其结束时弄清楚如何实现取消。

这种方法有什么问题吗?

【问题讨论】:

  • 这不是我所知道的标准方法,但我们的团队返回 URL /outstandingRequests/requestId 并且对该 URL 的 DELETE 是取消,而 GET 检索包含操作时的操作结果的状态已完成。 (不支持 PUT 和 POST)。
  • +1。说得通。事实上,我编辑我的帖子以反映您的建议并保持开放以寻找更多输入。
  • @Pace :我想你已经回答了这个问题。您能否将您的评论作为答案发布,以便我接受!

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2012-04-05
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多