我想要異步運行我的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()調用之後和在新的要求,而無需離開前一個(使用簡單的日誌報表調試)被接受。
那麼...什麼是阻止第二個請求?我真的不明白,或者我錯過了一些荒謬的東西?
在此先感謝!
使TestBean'@ RequestScoped'。一次只有一個線程可以訪問EJB實例。 –
TestBean是'@ Stateless'註釋的,所以容器會爲每個請求創建一個新實例(如果我們忽略池大小和重用)?所以每個線程都有自己的實例......如果我錯了,請糾正我。 – 2ChRisPY5
沒有理由認爲會發生;我相信它默認爲@Dependent,並且將它注入一個實際上是單例的JAX-RS服務。 –