2017-01-26 14 views
0

私は非同期に実行したいREST Webサービスに問題があります。この例は、私がしたいことを示しています。主な問題は、Webサービスが古いものが終了するまで新しい要求を受け入れていないことです。私はアプリケーションサーバーとそのRESTeasy実装としてWildfly 10を使用しています。非同期REST Webサービス

WebApplication.java

@ApplicationPath("rest") 
public class WebApplication extends Application 
{ 
    public WebApplication() 
    { 
     super(); 
    } 
} 

TestService.java

@Path("test") 
public class TestService 
{ 
    @Inject 
    private TestBean bean; 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public void getDateTime(@Suspended final AsyncResponse response) 
    { 
     CompletableFuture.supplyAsync(() -> response.resume(bean.getResult())) 
       .exceptionally((ex) -> (response.resume(ex))); 
    } 
} 

TestBean.java

@Stateless 
public class TestBean 
{ 
    public TestTO getResult() 
    { 
     Logger.getLogger(Thread.currentThread().getName()).log(Level.INFO, "Entering REST service"); 

     for (long l = 0; l < Long.MAX_VALUE; l++) 
     { 
      // just for simulating a veeeery heavy operation 
     } 
     return new TestTO(); 
    } 
} 

TestTOは単純なPOJOなので、特別なものはありません。何が間違っているのか想像できない。私はGoogleでさまざまなアプローチを見て検索しましたが、何も機能しませんでした。

私はresponse.resume()コールの後にループを置き、以前のものを残さずに新しい要求を受け入れました(デバッグするために単純なロギングステートメントを使用しました)。

So ... 2番目のリクエストをブロックするのは何ですか?私は本当にそれを得ることはできません、または何かばかげた行方不明ですか?

ありがとうございます!

+0

TestBeanを '@ RequestScoped'にします。一度に1つのスレッドだけがEJBインスタンスにアクセスできます。 –

+0

TestBeanは '@ Stateless'アノテートされているので、コンテナはリクエストごとに新しいインスタンスを作成します(プールサイズと再利用を無視すると)?だから、すべてのスレッドが独自のインスタンスを持っている...私が間違っている場合私を修正します。 – 2ChRisPY5

+0

それは起こると思う理由はありません。私はデフォルトで@Dependentと信じており、事実上シングルトンであるJAX-RSサービスにそれを注入しています –

答えて

0

さて、私はそれを理解しました。

リクエストを同時に実行するクライアントアプリケーションを作成せず、Firefoxを使用して出力をすばやく確認しました。 2つのタブを開き、ウェブサービスのURLを呼び出しました。後で私はMicrosoft Edgeと全く同じことをしました...その作業!例は100%になっています。

私はなぜそう思っているのでしょうか?おそらくEdgeがタブごとに完全な新しいプロセスを生成し、Firefoy doesntが原因ですか?次回はSoupUIを使用してWebサービスをテストします。

愚かな質問には申し訳ありません。私が正しく働いていたら、私はその問題を見ていました。

関連する問題