jersey 2.0 @suspended AsyncResponse,它有什么作用?

j2e*_*nue 5 java rest web-services jersey-2.0

我正在分析一些球衣2.0代码,我对如何使用以下方法有疑问:

@Stateless
  @Path("/mycoolstuff")
  public class MyEjbResource {
    …
    @GET
    @Asynchronous //does this mean the method executes on child thread ?
    public void longRunningOperation(@Suspended AsyncResponse ar) {
      final String result = executeLongRunningOperation();
      ar.resume(result);
    }

    private String executeLongRunningOperation() { … }
  }
Run Code Online (Sandbox Code Playgroud)

让我说在网络浏览器上我输入www.mysite/mycoolstuff这将执行方法,但我不明白asyncResponse用于@Asynchronous注释.从浏览器我怎么会注意到它的asychnronous?删除注释会有什么不同?在阅读文档后暂停注释我也不清楚它的用途.

是@Asynchronous注释只是告诉程序在新线程上执行此方法?做"新线程(.....)"是一种方便的方法吗?

更新:此注释使服务器无法挂在请求处理线程上.吞吐量可以更好.无论如何官方文档:

默认情况下,服务器上的请求处理在同步处理模式下工作,这意味着在单个I/O容器线程中处理请求的客户端连接.一旦处理请求的线程返回到I/O容器,容器就可以安全地假设请求处理已完成,并且可以安全地释放客户端连接,包括与连接关联的所有资源.该模型通常足以处理处理资源方法执行花费相对较短时间的请求.但是,如果已知资源方法执行需要很长时间来计算结果,则应使用服务器端异步处理模型.在此模型中,请求处理线程与客户端连接之间的关联被破坏.处理传入请求的I/O容器可能不再认为在请求处理线程返回时可以安全地关闭客户端连接.相反,需要公开用于显式挂起,恢复和关闭客户端连接的工具.请注意,使用服务器端异步处理模型不会改善客户端感知的请求处理时间.然而,通过将初始请求处理线程释放回I/O容器,同时请求可能仍在队列中等待处理或者处理可能仍在另一个专用线程上运行,它将增加服务器的吞吐量.已发布的I/O容器线程可用于接受和处理新的传入请求连接.

小智 3

@Suspished 如果你使用它的话,它会更明确,否则使用它不会有任何区别。

我们来谈谈它的好处:

  • @Suspished 将暂停/挂起当前线程,直到它得到响应,默认情况下 #NO_TIMEOUT 没有设置挂起超时。因此,这并不意味着您的请求响应 (I/O) 线程将获得空闲并可用于其他请求。
  • 现在假设您希望您的服务在某个特定时间做出响应,但您从资源调用的方法不能保证响应时间,那么您将如何管理您的服务响应时间?那时,您可以使用 为您的服务设置暂停超时@Suspended,甚至在超过时间时提供回退响应。

以下是设置挂起/暂停超时的一些代码示例

public void longRunningOperation(@Suspended AsyncResponse ar) {
       ar.setTimeoutHandler(customHandler);
       ar.setTimeout(10, TimeUnit.SECONDS);
       final String result = executeLongRunningOperation();
       ar.resume(result);
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅此