【Spring系列】DeferredResult异步处理
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
- 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
- 一.简单介绍
- 1.DeferredResult 简介
- 2.功能和特性
- 二.使用方式
- 1.Controller 中的方法
- 2.异步任务完成后设置结果
- 3.自定义线程池
- 三.原理分析
- 1.Servlet 异步支持
- 2.DeferredResult 中介
- 四.注意事项
- 1.超时处理
- 2.异常处理
- 3.不适用于所有场景
一.简单介绍
1.DeferredResult 简介
DeferredResult 是 Spring Framework 中用于异步处理请求的一种机制。它允许将处理结果推迟到稍后的时间点,通常用于处理需要较长时间完成的操作,例如异步任务、长时间计算或外部服务调用。
2.功能和特性
-
异步处理:
DeferredResult允许将请求的处理推迟到稍后的时间,允许应用程序异步地处理请求。 -
非阻塞: 使用
DeferredResult不会阻塞容器线程,这有助于提高应用程序的吞吐量。 -
长轮询: 可以使用
DeferredResult实现长轮询(long polling)模式,其中客户端发送请求并在服务器端保持挂起状态,直到有数据可用。
二.使用方式
1.Controller 中的方法
Controller 中的方法: 在控制器方法中,返回类型可以是 DeferredResult<T>,其中 T 是要返回的数据类型。
@GetMapping("/async-operation")
public DeferredResult<String> asyncOperation() {DeferredResult<String> deferredResult = new DeferredResult<>();// 在某个异步任务完成后,将结果设置到 DeferredResult 中asyncService.performAsyncOperation().whenComplete((result, throwable) -> deferredResult.setResult(result));return deferredResult;
}
2.异步任务完成后设置结果
异步任务完成后设置结果: 在异步任务完成后,通过 DeferredResult.setResult(result) 将结果设置到 DeferredResult 对象中。
public CompletableFuture<String> performAsyncOperation() {// 异步任务逻辑return CompletableFuture.supplyAsync(() -> "Async operation result");
}
3.自定义线程池
线程池:
public class ThreadPoolUntil {private static final int THREAD_POOL_SIZE = 10;private static ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);public static void executeTask(Runnable task) {executorService.submit(task);}public static void shutdown() {executorService.shutdown();}
}
controller:
@ApiOperation(value = "首页-合计列表", nickname = "首页-合计列表")
@PostMapping("/totalList")
public DeferredResult<Payload<List<TotalListDayDTO>>> totalList(@RequestBody TotalListQuery totalListQuery, @RequestHeader(value = "brandDetailNo") String brandDetailNo) {totalListQuery.setBrandDetailNo(brandDetailNo);DeferredResult<Payload<List<TotalListDayDTO>>> deferredResult = new DeferredResult<>(10000L);// 设置超时处理deferredResult.onTimeout(() -> deferredResult.setErrorResult(new Payload("504", "请求超时")));// 设置错误处理deferredResult.onError((Throwable t) -> deferredResult.setErrorResult(new Payload("500", "系统错误")));// 创建任务Runnable task = () -> deferredResult.setResult(new Payload(skuDataBusinessService.totalList(totalListQuery)));ThreadPoolUntil.executeTask(task);return deferredResult;
}
三.原理分析
1.Servlet 异步支持
Servlet 3.0+ 异步支持: DeferredResult 的实现依赖于 Servlet 3.0+ 的异步支持。在处理请求时,容器会将请求转交给异步处理,允许处理线程在异步操作完成前释放。
2.DeferredResult 中介
DeferredResult 作为中介: DeferredResult 充当控制器方法和异步任务之间的中介,使得控制器方法可以在异步任务完成后设置结果。
四.注意事项
1.超时处理
超时处理: 可以设置 DeferredResult 的超时时间,如果异步操作在超时时间内未完成,可以通过设置超时处理逻辑来处理。
deferredResult.setTimeout(5000); // 设置超时时间为5秒
deferredResult.onTimeout(() -> {// 处理超时逻辑deferredResult.setErrorResult("Operation timed out");
});
2.异常处理
异常处理: 需要在异步任务中捕获可能的异常,并在 DeferredResult 中设置错误结果。
asyncService.performAsyncOperation().whenComplete((result, throwable) -> {if (throwable != null) {deferredResult.setErrorResult("An error occurred: " + throwable.getMessage());} else {deferredResult.setResult(result);}});
3.不适用于所有场景
不适用于所有场景: DeferredResult 适用于长时间运行的操作,但并不是适用于所有场景。对于一些简单和快速的操作,同步处理可能更加合适。
总体而言,DeferredResult 是 Spring 中处理异步请求的强大工具,可以帮助改善应用程序的性能和用户体验,特别是在需要处理长时间运行操作的情况下。
觉得有用的话点个赞
👍🏻呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
相关文章:
【Spring系列】DeferredResult异步处理
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
使用晶振遇到的两个问题
并联电阻的问题 在一些方案中,晶振并联1MΩ电阻时,程序运行正常,而在没有1MΩ电阻的情况下,程序运行有滞后及无法运行现象发生。 原因分析: 在无源晶振应用方案中,两个外接电容能够微调晶振产生的时钟频率…...
手写promise A+、catch、finally、all、allsettled、any、race
目录 手写promise 同步版 1.Promise的构造方法接收一个executor(),在new Promise()时就立刻执行executor回调 2.executor()内部的异步任务被放入宏/微任务队列,等待执行 3.状态与结果的管理 状态只能变更一次 4.then()调用成功/失败回调 catch是…...
【原神游戏开发日志1】缘起
【原神游戏开发日志1】缘起 版权声明 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明 文章内容不得删减、修改、演绎 相关学习资源见文末 大家好,最近看到原神在TGA上频频获奖,作为一个14年经验的游戏开…...
leetcode5 最长公共前缀三种python解法
14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs ["flower","flow","flight"] 输出:"fl"示…...
对小程序的初了解
WXML和HTML的区别 标签名称不同 HTML:div、a、span、img WXML:view、text、image、navigator 属性节点不同 <a href"#">超链接</a> <navigator url"/pages/home/home"></navigator> 提供了类似vue的…...
QLineEdit 的 InputMask掩码
QLineEdit 的 InputMask掩码 A:只能输入字母,且不可省略 a:只能输入字母,可以省略 N:只能输入 字母和数字,且不可省略 n:只能输入 字母和数字,可以省略 X:可以输入任意字…...
关于队列的简单理解
1.队列(Queue) 1.1 关于队列 队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表, 队列具有先进先出 FIFO(First In First Out)的操作特性(队列是个接口); 入队列&#x…...
加密市场进入牛初阶段?一场新的造富效应即将拉开帷幕!
周一(12月4日),比特币一度上涨至42000美元,创下自2022年4月以来的最高水平。从目前比特币的走势来看,加密市场无疑已然进入到牛初阶段。 在牛市初期,确实存在人们不相信牛市到来的情况。由于在熊市中亏损的心理阻碍和对市场进一步…...
Superset基础入门
1 Superset概述 Apache Superset 是一个现代的数据探索和可视化平台。它功能强大且十分易用,可对接 各种数据源,包括很多现代的大数据分析引擎,拥有丰富的图表展示形式,并且支持自定义 仪表盘。 2 Superset安装 Superset 是由 P…...
【泛微ecology】将多个字段的数据合并到一个字段
doFieldSQL("select concat(concat(sqr,,),sy) as c from formtable_main_2 where requestid $requestid$ ")...
WebSocket入门介绍及编程实战
HTTP的限制 全双工和半双工: 全双工:全双工(Full Duplex)是允许数据在两个方向上同时传输。 半双工:半双工(Half Duplex)是允许数据在两个方向上传输,但是同一个时间段内只允许一个…...
vue3里面生命周期的使用
前言: vue2里面的生命周期和vue3生命周期是非常的相似的,我们通过访问生命周期钩子来处理不同场景之间的应用。 生命周期钩子的函数定义:每一个Vue组件实例在创建时都需要经历一系列的初始化步骤,比如数据侦听,编译模…...
在python的Scikit-learn库中,可以使用train_test_split函数来划分训练集和测试集。
文章目录 一、在Scikit-learn库中,可以使用train_test_split函数来划分训练集和测试集总结 一、在Scikit-learn库中,可以使用train_test_split函数来划分训练集和测试集 在Scikit-learn库中,可以使用train_test_split函数来划分训练集和测试…...
外包干了2个月,技术明显退步了...
先说一下自己的情况,大专生,19年通过校招进入广州某软件公司,干了接近5年的功能测试,今年11月份,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…...
数据结构:链表应用:第9关:删除链表中满足区间值的结点
任务描述编程要求 输入输出测试说明来源 任务描述 本关任务:利用单链表表示一个递增的整数序列,删除链表中值大于等于mink且小于等于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同…...
了解 ignore_above 参数对 Elasticsearch 中磁盘使用的影响
在 Elasticsearch 中,ignore_above 参数允许你忽略(而不是索引)长于指定长度的字符串。 这对于限制字段的大小以避免性能问题很有用。 在本文中,我们将探讨 “ignore_above” 参数如何影响 Elasticsearch 中字段的大小,…...
C#中的async/await异步编程模型
前言 当谈到异步编程时,C#中的async/await是一个强大且方便的工具。它使得编写并发和异步操作变得更加简单和可读,同时提供良好的可维护性。本文将详细解释async/await的使用,以及如何在C#中有效地利用它来实现异步操作。 目录 前言1. async…...
【原创】提升MybatisPlus分页便捷性,制作一个属于自己的分页插件,让代码更加优雅
前言 MybatisPlus的分页插件有一点非常不好,就是要传入一个IPage,别看这个IPage没什么大不了的,最多多写一两行代码,可这带来一个问题,即使用xml的查询没法直接取对象里面变量的值了,得Param指定xml中的变…...
pythonselenium自动化测试实战项目
说明:本项目采用流程控制思想,未引用unittest&pytest等单元测试框架 一.项目介绍 目的 测试某官方网站登录功能模块可以正常使用 用例 1.输入格式正确的用户名和正确的密码,验证是否登录成功; 2.输入格式正确的用户名和不…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

