java - 这种取消/中止异步 servlet 处理的方法存在任何问题

标签 java rest jakarta-ee servlets servlet-3.0

在异步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/

相关文章:

Java : Retrieve Column names from ResultSet

java - 在 for 循环中放置一个函数调用

c# - WCF Restful post 服务返回 BAD REQUEST(400)

jakarta-ee - 是否可以限制 Maven 构建的输出?

java - Hibernate 在整个 Spring Boot 应用程序上设置属性访问策略

java - 如何将具有不同字段计数的分隔文本行解析为对象,同时允许扩展?

c# - 传递嵌套复杂类型的 REST URL 语法是什么?

java - 将 swagger json 转换为 mashery io-docs json

jakarta-ee - apache tomcat 7.0.30 datasourcerealm javax.naming.NameNotFoundException : Name [jdbc/proto] is not bound in this Context. 无法找到 [jdbc]

java - 即使我有级联,子对象也不会被删除