在Spring MVC中为特定端点禁用请求超时
是否可以为特定的端点禁用请求超时?我有如下内容:
@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
确实移除了超时,但这是全局设置,这正是我想避免的
解决方案
是的。与其修改全局异步超时,不如为每个请求设置超时。WebAsyncTask 或 DeferredResult。这让你可以为其他端点保留默认超时。
对于你的情况 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。