如何在Spring Boot中处理异步请求超时?

4
我正在编写spring-boot应用程序的配置。我正在使用WebMvcConfigurer接口。我将默认超时设置为30秒,因为我使用了SseEmitter()进行事件处理(因为SseEmitter默认超时时间为30秒)。然而,在30秒后,它会给出警告Async request timed out。有没有一种方法可以重新设置超时或处理此错误?请帮助我解决这个问题。
谢谢提前:)
以下是我编写的内容。
@Configuration
public class EventConfiguration implements WebMvcConfigurer {
    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(30000);
    }
}

我遇到了以下错误:
2019-10-30 11:35:02.711  WARN 10728 --- [nio-8090-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Async request timed out
2019-10-30 11:35:02.712  WARN 10728 --- [nio-8090-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.context.request.async.AsyncRequestTimeoutException]
2019-10-30 11:35:03.699  WARN 10728 --- [nio-8090-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Async request timed out
2019-10-30 11:35:03.701  WARN 10728 --- [nio-8090-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.context.request.async.AsyncRequestTimeoutException]

您可以尝试使用给定的链接,在其中使用WebAsyncTask以及错误和超时回调方法:https://www.thetechnojournals.com/2019/10/asynchronous-rest-service.html - Ashok Prajapati
1个回答

4
如果您只想简单地处理异常,那么您可以编写一个异常处理程序来处理异常,类似于以下内容。
@ExceptionHandler(AsyncRequestTimeoutException.class)
    public final ResponseEntity<Object> handleAsyncRequestTimeoutException(AsyncRequestTimeoutException ex, WebRequest request) {
       ....
       ....
    }

如果您想做更多的事情,您可以编写自己的TimeoutCallableProcessingInterceptor。

@Bean
    public CallableProcessingInterceptor callableProcessingInterceptor() {
        return new TimeoutCallableProcessingInterceptor() {
            @Override
            public <T> Object handleTimeout(NativeWebRequest request, Callable<T> task) throws Exception {
                log.error("timeout!");
                return super.handleTimeout(request, task);
            }
        };
}

注意:我没有尝试过这个方法,如果它有效,请告诉我们。


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