在Spring MVC中为特定端点禁用请求超时

后端开发 2026-07-12

是否可以为特定的端点禁用请求超时?我有如下内容:

@RestController
public class Controller {
    ...
    @PostMapping(value = "/.../endpoint", produces = "application/zip")
    public ResponseEntity<StreamingResponseBody> renderImages(...){
        ...
    }
}

这个端点会渲染大量图片,并把完成的渲染结果以流的形式返回给前端。根据需要渲染的图片数量,这可能会超过30秒,这是MVC异步请求的默认超时。当前,即使有活动,流在30秒后似乎也会自动关闭。我希望让这个流在超过30秒后仍然保持开启状态,同时为API的其他端点保留超时设置。

在application.yaml中设置这个:

spring:
  mvc:
    async:
      request-timeout: -1

确实移除了超时,但这是全局设置,这正是我想避免的

解决方案

是的。与其修改全局异步超时,不如为每个请求设置超时。WebAsyncTaskDeferredResult。这让你可以为其他端点保留默认超时。

对于你的情况 StreamingResponseBody,把它包裹在WebAsyncTask中并指定一个自定义超时。

示例:

@PostMapping(value = "/.../endpoint", produces = "application/zip")
public WebAsyncTask<ResponseEntity<StreamingResponseBody>> renderImages(...) {

    StreamingResponseBody stream = outputStream -> {
        // rendering + streaming logic
    };

    ResponseEntity<StreamingResponseBody> response =
            ResponseEntity.ok().body(stream);

    // disable timeout for this endpoint (-1) or set custom timeout in ms
    return new WebAsyncTask<>(-1, () -> response);
}

你也可以设置一个更长的超时,而不是完全禁用它:

return new WebAsyncTask<>(600_000, () -> response); // 10 minutes
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章