【发布时间】:2019-10-18 17:19:28
【问题描述】:
我想在我的 Spring Boot 应用程序中为匹配 /async/* 的请求映射子集配置异步处理支持。例子:
localhost:8080/async/downloadLargeFilelocalhost:8080/async/longRunningRask
以第一个例子为例,我使用StreamingResponseBody实现了我的方法如下:
@GetMapping
public ResponseEntity<StreamingResponseBody> downloadLargeFile() throws IOException {
long size = Files.size(path);
InputStream inputStream = Files.newInputStream(path);
return ResponseEntity.ok()
.contentLength(size)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=large_file.txt")
.body(inputStream::transferTo);
}
在StreamingResponseBody 的文档中,它声明我应该配置一个AsyncTaskExecutor,所以我有这个实现WebMvcConfigurer 的@Configuration 类:
@Configuration
public class AsyncConfigurer implements WebMvcConfigurer {
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setDefaultTimeout(-1);
configurer.setTaskExecutor(asyncTaskExecutor());
}
@Bean
public AsyncTaskExecutor asyncTaskExecutor() {
return new SimpleAsyncTaskExecutor("async");
}
}
但是,我无法找到一种方法来将此任务执行器仅用于与给定模式匹配的请求。
作为一个更一般的问题 - 我如何限制 WebMvcConfigurer 仅适用于匹配模式的请求子集?
如果这不可能或不推荐,那么完成相同行为的正确方法是什么?
【问题讨论】:
-
您的应用程序中是否有更多使用异步的部分?此执行程序将仅用于 Web 应用程序的异步部分。此外,您可能不想使用
SimpleAsyncTaskExecutor,而是使用基于线程池的。 -
嗨@M.Deinum,您所说的“Web 应用程序的异步部分”是什么意思?那具体是怎么定义的?是的,我也想将
AsyncTaskExecutor用于其他请求,但将其限制为只为一个请求会有所帮助。如果我有多个异步请求,您是否建议我可能想使用一个池化请求? -
你想限制创建线程的数量,这个是动态创建线程的。正常请求由您的 servlet 容器处理,异步一次(就像您在这里一样)被传递给您定义的
TaskExecutor,以便常规请求处理线程可以再次处理其他传入请求。 -
但是上下文如何知道哪些请求是异步的,哪些不是 - 即它如何知道将事物路由到哪个任务执行器?
-
异步任务只有1个任务执行器,其他请求由servlet容器处理。异步内容取决于控制器的返回类型。
Future、Flux或StreamingResponseBody之类的东西是异步处理的(请查看 spring 文档)。
标签: java spring spring-boot