Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这种取消/中止异步servlet处理的方法有任何问题吗_Java_Rest_Jakarta Ee_Servlets_Servlet 3.0 - Fatal编程技术网

Java 这种取消/中止异步servlet处理的方法有任何问题吗

Java 这种取消/中止异步servlet处理的方法有任何问题吗,java,rest,jakarta-ee,servlets,servlet-3.0,Java,Rest,Jakarta Ee,Servlets,Servlet 3.0,在异步servlet处理场景中,我希望实现请求的取消。 (我也希望保持这种平静) 比如说,我有这样一个代码: @RequestMapping("/quotes") @ResponseBody public void quotes() { //... final AsyncContext ac = request.startAsync(); ac.setTimeout(0); RunJob job = new RunJob(ac); asyncContexts.add

在异步servlet处理场景中,我希望实现请求的取消。 (我也希望保持这种平静)

比如说,我有这样一个代码:

@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执行删除请求,并让服务器了解如何在结束时实现取消

这种方法有任何问题吗?

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

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

据我所知,这不是一种标准方法,但我们的团队返回URL/outstandingRequests/requestId,删除该URL即为取消,而GET-Retrieve则表示操作完成时包含操作结果的状态。(不支持PUT和POST)。+1。有道理。事实上,我编辑我的帖子是为了反映你的建议,并保持开放状态以寻求更多的意见。@Pace:我想你已经回答了这个问题。你能把你的评论作为一个答案,这样我就可以接受了!据我所知,这不是一种标准方法,但我们的团队返回URL/outstandingRequests/requestId,对该URL的删除是取消,GET则返回状态,其中包括操作完成后的操作结果。(不支持PUT和POST)。+1。有道理。事实上,我编辑我的帖子是为了反映你的建议,并保持开放状态以寻求更多的意见。@Pace:我想你已经回答了这个问题。你能把你的评论作为一个答案,这样我就可以接受了!