在所有异步请求中设置默认超时时间

4

我在我的请求中使用@Suspended AsyncResponse response,并启动线程来处理请求。当进程完成时,我尝试恢复响应,但是RestEasy将请求标记为已完成,因为请求线程已经完成,并且响应中没有设置超时时间。如果我设置超时时间,它可以正常工作,但我需要为每个想要实现的异步请求设置超时时间。有没有办法水平设置所有暂停的AsyncRequests的超时时间?

1个回答

1
很遗憾,JAX-RS 2.0规范, RESTEasy文档Jersey文档都没有提及如何为AsyncResponse设置默认超时时间。 Jersey文档提到了以下内容:
默认情况下,暂停的 AsyncResponse 实例没有定义超时时间。可以使用 setTimeoutHandler(TimeoutHandler)setTimeout(long, TimeUnit) 方法定义自定义超时和超时事件处理程序。setTimeoutHandler(TimeoutHandler) 方法定义超时时将被调用的处理程序。处理程序使用响应代码 503(来自 Response.Status.SERVICE_UNAVAILABLE)恢复响应。也可以定义超时间隔而不指定自定义超时处理程序(仅使用 setTimeout(long, TimeUnit) 方法)。
所以,解决方案与您已经使用的解决方案没有区别:
@GET
public void longRunningOperation(@Suspended final AsyncResponse asyncResponse) {

    // Register a timeout handler
    asyncResponse.setTimeoutHandler(new TimeoutHandler() {

        @Override
        public void handleTimeout(AsyncResponse asyncResponse) {
            asyncResponse.resume(Response.status(SERVICE_UNAVAILABLE)
                .entity("Operation timed out. Please try again.").build());
        }
    });

    // Set timeout
    asyncResponse.setTimeout(15, SECONDS);

    // Execute long running operation in new thread
    executor.execute(new Runnable() {

        @Override
        public void run() {
            executeLongRunningOp();
            asyncResponse.resume("Hello async world!");
        } 
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接