2016-08-08 50 views
0

我正在尝试创建异步的Jersey RESTful webap。Jersey异步多线程响应?

以下代码用于测试实现,但它不起作用。

@Path("/demox") 
public class RESTClient { 

    public static boolean ran = false; 

    @GET 
    @Path("/test") 
    @ManagedAsync 
    public void test(@Suspended final AsyncResponse asyncResponse) throws InterruptedException { 
     asyncResponse.setTimeout(10000, TimeUnit.MILLISECONDS); 
     asyncResponse.setTimeoutHandler(ar -> ar.resume(
       Response.status(Response.Status.SERVICE_UNAVAILABLE) 
         .entity("Operation timed out") 
         .build())); 
     if(!ran) { 
      while(true) { 
       ran = true; 
      } 
     } 
     asyncResponse.resume("REST IS OKAY! "); 
    } 
} 

我测试它的方式是我打开两次URL。但第二个标签总是等待第一个超时。所以这显然不起作用。

Servlet的文件:

<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>services,org.codehaus.jackson.jaxrs</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    <async-supported>true</async-supported> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

回答

0

我觉得这是工作。因此到here

通过AsyncResponse参数到资源的方法,我们知道,该方法应该使用异步处理模式被调用的泽西运行时,也就是在客户端连接不应该由下面的自动关闭方法返回时的I/O容器。相反,注入的AsyncResponse实例(表示挂起的客户端请求连接)将用于使用其他线程将响应显式发送回客户端。换句话说,Jersey运行时知道,当asyncGet方法完成时,对客户端的响应可能还没有准备好,并且处理必须暂停,等待一旦响应变为可用,就等待显式恢复。

+0

是的。但是,您如何解释第二个浏览器选项卡加载所需的等待时间?所有在第一个标签之后打开的标签等待它完成加载,然后立即加载。 –

+0

提到的链接现在被破坏,可以查看:https://jersey.github.io/documentation/latest/async.html – anand