2017-01-26 160 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服务。

我很抱歉,这个愚蠢的问题。如果我工作正常,我已经看到了这个问题。