2016-08-08 16 views
0

私は非同期Jersey RESTful webapを作成しようとしています。ジャージ非同期マルチスレッドレスポンス?

次のコードは実装のテストに使用されていますが、機能していません。

@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を2回開くことです。しかし、2番目のタブは常に最初のタブがタイムアウトするのを待ちます。これは明らかに機能しません。

サーブレットファイル:

<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

はい。しかし、2番目のブラウザのタブが読み込まれるのに必要な待ち時間はどのように説明しますか?最初のタブの後に開いているすべてのタブは、読み込みが完了するのを待ってから、すぐに読み込まれます。上記の –

+0

リンクが壊れている場合は、https://jersey.github.io/documentation/latest/async.htmlを参照してください。 – anand