当前位置: 首页 > 面试题库 >

REST与JAX-RS-处理长时间运行的操作

鞠嘉誉
2023-03-14
问题内容

我有一个用JAX-
RS实现的REST服务。有些操作需要很长时间才能完成,可能需要15到30分钟。对于这些情况,我倾向于派遣一个后台线程来处理长时间运行的操作,然后立即以HTTP状态202
ACCEPTED进行响应。响应将包含一个带有URL的位置标头,客户端可使用该标头来轮询进度。

这种方法需要创建线程来处理长时间运行的操作,以便可以立即返回202 ACCEPTED。我也知道在Java EE容器中创建自己的线程通常是不好的做法!

我的问题如下:

  1. 人们是否同意这是正确的方法?
  2. 假设它是正确的,人们是否可以推荐一个“良好实践”解决方案,使我能够在后台调度长时间运行的操作并立即返回?

另外,为了避免管理自己的线程,我研究了JAX-RS异步服务器api。不幸的是,尽管这提高了服务器的吞吐量,但它不允许我立即以ACCEPTED响应。

泽西州规定:

Note that the use of server-side asynchronous processing model will not improve the 
request processing time perceived by the client. It will however increase the
throughput of the server, by releasing the initial request processing thread back to
the I/O container while the request may still be waiting in a queue for processing or    
the processing may still be running on another dedicated thread. The released I/O  
container thread can be used to accept and process new incoming request connections.

任何帮助表示赞赏。谢谢!


问题答案:

我认为Jersey Async文档很好地解决了这个问题。这是一个简短的摘要:

@Path("/async/longRunning")
public class MyResource {

   @GET
   public void longRunningOp(@Suspended final AsyncResponse ar) {
       executor.submit(
            new Runnable() {
                public void run() {
                    executeLongRunningOp();
                    ar.resume("Hello async world!");
                } });
  }
}

在文档中引用以下报价时:

请注意,使用服务器端异步处理模型不会缩短客户端感知的请求处理时间。(…)

我想你误会了一点。文档的作者试图在这里表达的是,异步处理不会仅仅靠自身来加快处理速度。但是可以使用以下示例立即返回响应:

return Response.status(Status.ACCEPTED).build();


 类似资料:
  • 我正在尝试将一个向服务器发送消息的异步任务迁移到RxJava。该任务大致执行以下操作: 1) 创建将要发送的消息(保存到数据库) 2)向用户显示消息(状态为“发送”) 3)将消息发送到服务器(下面的代码段) 4)将消息标记为已发送或失败(保存到数据库) 5)更新UI 我创建了所需的Rx链,部分如下所示: 当我订阅上述内容时,我会得到一个一次性的。通常,我会将其添加到CompositeDisposa

  • 问题内容: 我有一个“长期运行的”清理行动,我需要执行我的。做这个的最好方式是什么? 如果我使用a 这样做,我将立即返回;但是线程引用发生了什么?我正在寻找有关此处需要了解的任何影响/陷阱/绊网的建议,因为我认为即使活动被销毁,该流程仍将继续存在。 背景: 我在我的应用程序中使用JmDNS。当用户使用完我的应用程序后,我想清理JmDNS实例。我使用类方法进行此操作。但是,此方法需要 5秒钟以上 才

  • 经过长时间的调查,问题似乎是长时间运行的请求超时,并且在NodeJS中再次调用endpoint。没有来自浏览器的新网络请求。我做了一些测试,2分钟后再次调用endpoint。我读到NodeJS中http请求的默认超时时间为2分钟。 https://nodejs.org/docs/latest-v12.x/api/http.html#http_server_timeout 我使用的是NestJS(有

  • 问题内容: 我真的很困惑。我已经尝试过使用tomcat的Jax-rs并使用所有能够使用调用我的服务的注释。因此,没有Jax- rs,我可以简单地拥有一个servlet并调用我的服务。同样,正如我尝试过的那样,有jax-rs和jersey(我研究了的实现)以及web.xml中的以下内容。 然后,我在GET上具有与JAX-RS相同的注释,可以使用正确的URL调用我的服务。 我的问题是,为什么球衣使用s

  • 非常感谢你的见解。

  • 我们有一个不稳定的旧单块系统,95%的请求在500毫秒内处理,但其他5%需要 我们当前的方法是使用具有指数回退重试机制的异步http客户端。但随着流量的增加,这将导致性能问题 我的想法是在S中有一个超时500毫秒的同步超文本传输协议调用和一个回退方法,该方法将一个任务添加到队列中,以便将来重试超文本传输协议请求,同时将202返回给C,并返回一个链接来检查任务的状态,类似于。我知道我需要将S公开的服