我想要异步运行我的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服务。 –