2017-01-26 159 views
0

我想要異步運行我的REST web服務時遇到問題。這個例子顯示了我想要做的事情。主要的問題是,Web服務在舊的完成之前不接受新的請求。我將Wildfly 10用作我的應用程序服務器和RESTeasy實現。異步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,所以沒什麼特別的。我無法想象什麼是錯的。我在谷歌搜索看看不同的方法,但沒有任何工作。這是我試過了,也只是爲了測試:

我把環路response.resume()調用之後和在新的要求,而無需離開前一個(使用簡單的日誌報表調試)被接受。

那麼...什麼是阻止第二個請求?我真的不明白,或者我錯過了一些荒謬的東西?

在此先感謝!

+0

使TestBean'@ RequestScoped'。一次只有一個線程可以訪問EJB實例。 –

+0

TestBean是'@ Stateless'註釋的,所以容器會爲每個請求創建一個新實例(如果我們忽略池大小和重用)?所以每個線程都有自己的實例......如果我錯了,請糾正我。 – 2ChRisPY5

+0

沒有理由認爲會發生;我相信它默認爲@Dependent,並且將它注入一個實際上是單例的JAX-RS服務。 –

回答

0

好的,我想通了。

我沒有寫一個同時執行請求的客戶端應用程序,而是使用Firefox來快速查看輸出。我打開了2個選項卡並調用了web服務的URL。後來我做了和微軟Edge完全一樣的工作......它的工作! exmaple正在努力達到100%。

我不知道爲什麼......也許是因爲Edge每個標籤產生一個完整的新流程,而Firefoy不是?沒關係,下次我使用SoupUI來測試web服務。

我很抱歉,這個愚蠢的問題。如果我工作正常,我已經看到了這個問題。