Jersey异步多线程响应?

时间:2016-08-08 22:47:35

标签: java multithreading rest jersey jax-rs

我正在尝试创建异步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>

1 个答案:

答案 0 :(得分:0)

我认为它有效。相应于here

  

通过将AsyncResponse参数转换为资源方法,我们告诉Jersey运行时该方法应该使用异步处理模式调用,即当方法时,底层I / O容器不应自动关闭客户端连接回报。相反,注入的AsyncResponse实例(表示挂起的客户端请求连接)将用于使用其他线程将响应显式发送回客户端。换句话说,Jersey运行时知道当asyncGet方法完成时,对客户端的响应可能还没有准备好,并且必须暂停处理并等待一旦响应可用,就会显着恢复。