将 Spring Boot WebMvcConfigurer 限制为仅指定路径

Posted

技术标签:

【中文标题】将 Spring Boot WebMvcConfigurer 限制为仅指定路径【英文标题】:Limit Spring Boot WebMvcConfigurer to specified paths only 【发布时间】:2019-10-18 17:19:28 【问题描述】:

我想在我的 Spring Boot 应用程序中为匹配 /async/* 的请求映射子集配置异步处理支持。例子:

localhost:8080/async/downloadLargeFile localhost: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容器处理。异步内容取决于控制器的返回类型。 FutureFluxStreamingResponseBody 之类的东西是异步处理的(请查看 spring 文档)。 【参考方案1】:

当为WebMvcConfigurer 配置WebMvcConfigurer 时,TaskExecutor 将仅用于 Web 请求的异步处理。所有其他请求都由 servlet 容器上可用的默认请求处理线程处理。

异步性质由方法的返回类型定义。异步类型在 Spring 参考指南的 MVC Async 部分中进行了描述。

【讨论】:

以上是关于将 Spring Boot WebMvcConfigurer 限制为仅指定路径的主要内容,如果未能解决你的问题,请参考以下文章

将 spring boot 与 redis 混合使用

Spring Boot with Spring Boot:将基本身份验证与JWT令牌身份验证相结合[复制]

将 lombok 与 gradle 和 spring-boot 一起使用

Spring Boot 将实例注册为 bean

Spring boot将配置属性注入到bean类中

将初始数据导入 Spring Boot 应用程序