Spring Boot REST API - 请求超时?

2022-08-31 23:53:07

我有一个Spring Boot REST服务,有时作为请求的一部分调用第三方服务。我想在我的所有资源上设置一个超时(假设5秒),这样如果任何请求处理(从传入到响应的整个链)花费的时间超过5秒,我的控制器使用HTTP 503而不是实际响应进行响应。如果这只是一个春天的属性,例如设置,那就太好了

spring.mvc.async.request-timeout=5000

但我没有运气。我还尝试扩展 WebMvcConfigurationSupport 并覆盖 configureAsyncSupport:

@Override
public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
    configurer.setDefaultTimeout(5000);
    configurer.registerCallableInterceptors(timeoutInterceptor());
}

@Bean
public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
    return new TimeoutCallableProcessingInterceptor();
}

没有任何运气。

我怀疑我必须手动计时所有第三方调用,如果它们花费的时间太长,请抛出超时异常。是吗?或者有没有更简单、更全面的解决方案来涵盖我的所有请求端点?


答案 1

如果你想工作,你需要返回一个。Callable<>spring.mvc.async.request-timeout=5000

@RequestMapping(method = RequestMethod.GET)
public Callable<String> getFoobar() throws InterruptedException {
    return new Callable<String>() {
        @Override
        public String call() throws Exception {
            Thread.sleep(8000); //this will cause a timeout
            return "foobar";
        }
    };
}

答案 2

注释采用超时参数,您可以在其中为特定方法指定超时(以秒为单位)@Transactional@RestController

@RequestMapping(value = "/method",
    method = RequestMethod.POST,
    produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
@Transactional(timeout = 120)

推荐