我正在尝试创建异步Jersey RESTful webap。
以下代码用于测试实现,但它无法正常工作。
@Path("/demox")
public class RESTClient {
public static boolean ran = false;
@GET
@Path("/test")
@ManagedAsync
public void test(@Suspended final AsyncResponse asyncResponse) throws InterruptedException {
asyncResponse.setTimeout(10000, TimeUnit.MILLISECONDS);
asyncResponse.setTimeoutHandler(ar -> ar.resume(
Response.status(Response.Status.SERVICE_UNAVAILABLE)
.entity("Operation timed out")
.build()));
if(!ran) {
while(true) {
ran = true;
}
}
asyncResponse.resume("REST IS OKAY! ");
}
}
我测试它的方式是我打开网址两次。但是第二个选项卡总是等待第一个超时。所以这显然不起作用。
Servlet文件:
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>services,org.codehaus.jackson.jaxrs</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
答案 0 :(得分:0)
我认为它有效。相应于here:
通过将AsyncResponse参数转换为资源方法,我们告诉Jersey运行时该方法应该使用异步处理模式调用,即当方法时,底层I / O容器不应自动关闭客户端连接回报。相反,注入的AsyncResponse实例(表示挂起的客户端请求连接)将用于使用其他线程将响应显式发送回客户端。换句话说,Jersey运行时知道当asyncGet方法完成时,对客户端的响应可能还没有准备好,并且必须暂停处理并等待一旦响应可用,就会显着恢复。