程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • SpringMVC

    • SpringMVC 入门
    • Spring MVC 数据接收
    • Spring MVC 数据返回
    • Spring MVC 路径匹配规则
    • Spring MVC 内容协商策略
    • Spring MVC 异步请求处理
      • 1. 配置异步请求处理
        • 1.1 关键配置参数说明
      • 2. 使用异步请求处理
      • 3. 异步请求处理的工作流程
      • 4. 更复杂的异步请求:使用 DeferredResult
      • 5. 注意事项与最佳实践
    • Spring MVC 静态资源处理
    • Spring MVC 自定义格式化器
    • SpringMVC 自定义拦截器
    • SpringMVC 配置跨域(CORS)
    • Spring MVC 自定义视图控制器
    • Spring MVC 自定义视图解析器
    • Spring MVC 自定义方法参数解析器
    • Spring MVC 自定义返回值处理器
    • Spring MVC 自定义消息转换器
    • Spring MVC 消息转换器扩展
    • Spring MVC 自定义异常处理器
    • Spring MVC 自定义异常处理器扩展
  • SpringMVC
  • SpringMVC
scholar
2024-08-17
目录

Spring MVC 异步请求处理

# Spring MVC 异步请求处理

前言

在 Spring MVC 中,异步请求处理是一种提升系统性能的重要手段,尤其适用于处理耗时较长的任务。通过异步请求,服务器可以释放线程资源以处理更多的请求,从而提高整体的吞吐量和响应速度。

# 1. 配置异步请求处理

通过实现 WebMvcConfigurer 接口并重写 configureAsyncSupport 方法,可以自定义异步请求的配置,包括设置超时时间、注册拦截器、配置任务线程池等。

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        // 注册 Callable 的拦截器,用于处理异步请求的超时、异常等
        configurer.registerCallableInterceptors(new TimeoutCallableProcessingInterceptor());
        
        // 设置异步请求的默认超时时间,单位为毫秒
        configurer.setDefaultTimeout(3000); // 3秒
        
        // 配置异步请求使用的线程池
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5); // 核心线程数
        taskExecutor.setMaxPoolSize(10); // 最大线程数
        taskExecutor.setQueueCapacity(25); // 队列容量
        taskExecutor.initialize(); // 初始化线程池
        configurer.setTaskExecutor(taskExecutor); // 设置自定义线程池
    }

    // 定义 Callable 的超时拦截器 Bean
    @Bean
    public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
        return new TimeoutCallableProcessingInterceptor();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 1.1 关键配置参数说明

  • registerCallableInterceptors:注册 CallableProcessingInterceptor,用于在异步请求的不同阶段执行自定义逻辑。通常用于处理超时、异常或请求完成后的清理工作。
  • setDefaultTimeout:设置异步请求的默认超时时间(单位为毫秒)。如果异步任务未能在指定时间内完成,则返回超时错误。
  • setTaskExecutor:配置异步任务执行的线程池,通过自定义线程池来管理异步请求的执行。例如,配置核心线程数、最大线程数和队列容量等。
  • TimeoutCallableProcessingInterceptor:处理异步请求超时的拦截器,当任务超时时触发指定的逻辑。

# 2. 使用异步请求处理

在控制器中,可以通过返回 Callable 或 DeferredResult 类型来实现异步请求。以下示例展示了如何使用 Callable 处理异步请求:

@RestController
public class AsyncController {

    @GetMapping("/async")
    public Callable<String> handleAsyncRequest() {
        return () -> {
            // 模拟一个耗时任务
            Thread.sleep(2000); // 休眠2秒
            return "异步响应成功!";
        };
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
  • Callable<String>:Spring MVC 通过 Callable 支持异步请求。当调用 Callable 时,Spring 会将该任务交给配置的线程池执行,主线程则被释放以处理其他请求。
  • 在上述示例中,当你访问 http://localhost:8080/async 时,Spring MVC 会异步地处理该请求,最终返回 "异步响应成功!"。

# 3. 异步请求处理的工作流程

  1. 客户端发送请求至 /async。
  2. Spring MVC 检测到控制器方法返回 Callable 类型,启动异步处理,并立即释放主线程。
  3. 异步任务交由配置的线程池执行,完成后返回结果。
  4. 如果任务在设定的超时时间内完成,返回正常响应;如果超时则触发超时拦截器处理逻辑。

# 4. 更复杂的异步请求:使用 DeferredResult

除了 Callable,Spring MVC 还支持使用 DeferredResult 处理更复杂的异步场景,例如需要在不同线程中手动完成异步处理:

@RestController
public class AsyncController {

    @GetMapping("/deferred")
    public DeferredResult<String> handleDeferredRequest() {
        // 设置超时时间为 5 秒
        DeferredResult<String> deferredResult = new DeferredResult<>(5000L);
        
        // 模拟异步处理,使用新线程返回结果
        new Thread(() -> {
            try {
                Thread.sleep(3000); // 模拟耗时任务
                deferredResult.setResult("异步处理完成!");
            } catch (InterruptedException e) {
                deferredResult.setErrorResult("异步处理异常!");
            }
        }).start();

        return deferredResult;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  • DeferredResult<String>:适用于需要手动控制异步任务完成时间的场景。与 Callable 不同,DeferredResult 允许你在任意线程中完成请求处理。
  • 在上述示例中,访问 /deferred 将启动一个异步任务,该任务在 3 秒后返回响应。

# 5. 注意事项与最佳实践

  • 合理设置超时时间:异步请求超时时间应根据业务需求合理设置,避免请求因超时而失败。
  • 线程池配置:异步任务的执行依赖于线程池,需根据系统负载配置合适的线程池参数,如核心线程数、最大线程数、队列容量等。
  • 异常处理:在异步处理过程中,应捕获并处理可能出现的异常,确保系统的健壮性。

总结

  • Spring MVC 提供了强大的异步处理机制,通过配置 AsyncSupportConfigurer 可以灵活定制异步请求的处理方式。
  • 使用 Callable 处理简单的异步请求,使用 DeferredResult 处理更复杂的异步场景。
  • 合理配置线程池、超时拦截器等,可以确保异步请求处理的高效性和稳定性。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Spring MVC 内容协商策略
Spring MVC 静态资源处理

← Spring MVC 内容协商策略 Spring MVC 静态资源处理→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式