2016-08-08 48 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