Java 异步REST Web服务

Java 异步REST Web服务,java,web-services,rest,jakarta-ee,asynchronous,Java,Web Services,Rest,Jakarta Ee,Asynchronous,我想异步运行的REST Web服务有问题。示例显示了我想要做的事情。主要问题是,在旧请求完成之前,web服务不接受新请求。我正在使用Wildfly 10作为我的应用服务器及其RESTeasy实现 WebApplication.java @ApplicationPath("rest") public class WebApplication extends Application { public WebApplication () { super(); }

我想异步运行的REST Web服务有问题。示例显示了我想要做的事情。主要问题是,在旧请求完成之前,web服务不接受新请求。我正在使用Wildfly 10作为我的应用服务器及其RESTeasy实现

WebApplication.java

@ApplicationPath("rest")
public class WebApplication extends Application
{
    public WebApplication ()
    {
        super();
    }
}
@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)));
    }
}
@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();
    }
}
TestService.java

@ApplicationPath("rest")
public class WebApplication extends Application
{
    public WebApplication ()
    {
        super();
    }
}
@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)));
    }
}
@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();
    }
}
TestBean.java

@ApplicationPath("rest")
public class WebApplication extends Application
{
    public WebApplication ()
    {
        super();
    }
}
@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)));
    }
}
@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();
    }
}
@无状态
公共类TestBean
{
公共TestTO getResult()
{
Logger.getLogger(Thread.currentThread().getName()).log(Level.INFO,“进入REST服务”);
对于(长l=0;l
TestTO只是一个简单的POJO,因此没有什么特别之处。我想象不出有什么不对劲。我在谷歌上搜索了一下不同的方法,但没有任何效果。我也试过,只是为了测试:

我将循环放在response.resume()调用之后,接受了一个新请求,而没有离开前一个请求(使用简单的日志语句进行调试)

所以。。。什么是阻止第二个请求?我真的不明白,还是我错过了一些可笑的事情


提前谢谢

好吧,我知道了

我没有编写同时执行请求的客户端应用程序,而是使用Firefox快速查看输出。我打开了两个选项卡,并调用了Web服务的URL。后来,我对Microsoft Edge做了完全相同的操作,并且。。。它起作用了!exmaple正在100%工作

我不知道为什么。。。可能是因为Edge正在为每个选项卡生成一个完整的新进程,而Firefoy没有?没关系,下次我用SoupUI测试Web服务时


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

让TestBean
@RequestScoped
。一次只能有一个线程访问EJB实例。TestBean是带注释的
@Stateless
,因此容器将为每个请求创建一个新实例(如果我们忽略池大小和重用)?所以每个线程都有自己的实例。。。如果我错了,请纠正我。没有理由认为这会发生;我相信它默认为@Dependent,您正在将它注入到一个JAX-RS服务中,该服务实际上是一个singletonI,通过一个简单的日志语句向bean添加了一个
@PostConstruct
方法。在日志文件中,我可以看到每个请求的相关消息。所以我想,每次都会创建一个新实例。如果我将bean更改为
@Singleton
,那么启动时只会出现一条日志记录(显然)。