Java 异步REST Web服务
我想异步运行的REST Web服务有问题。示例显示了我想要做的事情。主要问题是,在旧请求完成之前,web服务不接受新请求。我正在使用Wildfly 10作为我的应用服务器及其RESTeasy实现 WebApplication.javaJava 异步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(); }
@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
,那么启动时只会出现一条日志记录(显然)。