【Spring系列】DeferredResult异步处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐: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.功能和特性

  1. 异步处理: DeferredResult 允许将请求的处理推迟到稍后的时间,允许应用程序异步地处理请求。

  2. 非阻塞: 使用 DeferredResult 不会阻塞容器线程,这有助于提高应用程序的吞吐量。

  3. 长轮询: 可以使用 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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/231651.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Opencv 极坐标变换

变换后图片 代码 // 以Center为极坐标原点&#xff0c;将RowFrom到RowTo的圆环&#xff0c;仅仅变换该范围内的点&#xff0c;忽略掉其他部分。 #include "polar_transeforme.hpp" #include <string>using namespace cv;void calculate_map(int rouFrom, int …

错误 LNK2001 无法解析的外部符号 __imp__CrtDbgReport

”属性“ -->”设置“ --> ”c“ – > ”代码生成“ --> ”运行库“ &#xff0c;将 ”多线程(MT)“ 改为 ”多线程(MTD)“。

CSS核心功能手册:从熟悉到精通

CSS核心功能代码 文章目录 CSS核心功能代码[toc]参考HTML代码尺寸操作设置元素尺寸内边距外边距设置默认布局边距用途和使用场景&#xff1a; 背景设置**背景颜色 (background-color)**:**背景图像 (background-image)**:**背景重复 (background-repeat)**:**背景位置 (backgro…

软件测试测试文档的编写和阅读

在软件测试中的流程中&#xff0c;测试文档也是一个重要的流程&#xff0c;所以测试人员也需要学习测试文档的编写和阅读。 一、定义&#xff1a; 测试文档&#xff08;Testing Documentation&#xff09;记录和描述了整个测试流程&#xff0c;它是整个测试活动中非常重要的文…

Python Xorbits库:实现无限可能的编程旅程

概要 Python Xorbits是一个强大而多功能的开源Python库&#xff0c;为开发者提供了实现创新和复杂计算的能力。它提供了各种功能和工具&#xff0c;帮助开发者在编程旅程中探索无限可能。本文将详细介绍Python Xorbits的用途和使用教程&#xff0c;帮助读者了解和掌握这个令人…

<蓝桥杯软件赛>零基础备赛20周--第8周第1讲--十大排序

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

Ilya Sutskever:师从Hinton,“驱逐”奥特曼,一个改变AI世界的天才科学

ChatGPT 已经在全球爆火&#xff0c;但大众在两周之前似乎更熟悉Sam Altman&#xff0c;而对另一位创始人 Ilya Sutskever 却了解不多。 直到前几天因为OpenA眼花缭乱的政权争夺大戏&#xff0c;OpenAI 的首席科学家Ilya Sutskever的名字逐渐被世人所知。 Ilya Sutskever在科…

RabbitMQ消息模型之发布订阅Publish-Subscribe

发布订阅模型 Publish/Subscribe 发布订阅模型也称为广播模型&#xff0c;交换机类型需要指定为Fanout&#xff0c;正如从名称中猜到的那样&#xff0c;它是将接收到的所有消息广播到它知道的所有队列中。每个消费者都监听自己的队列&#xff0c;所以同一个消息&#xff0c;会…

某60物联网安全之IoT漏洞利用实操2学习记录

物联网安全 文章目录 物联网安全IoT漏洞利用实操2&#xff08;内存破坏漏洞&#xff09;实验目的实验环境实验工具实验原理实验内容实验步骤ARM ROP构造与调试MIPS栈溢出漏洞逆向分析 IoT漏洞利用实操2&#xff08;内存破坏漏洞&#xff09; 实验目的 学会ARM栈溢出漏洞的原理…

第二部分 系统管理篇

文件和目录管理 Linux基础 在Linux操作系统中&#xff0c;一切都是文件。Linux文件是区分大小写的。 Linux文件的拓展名和它的种类没有任何关系 Linux的目录结构为树状结构&#xff0c;顶级的目录为根目录“/”。 文件类型 用file命令查看文件类型 文件操作命令 1.mkdir创…

Java---类的继承

文章目录 1. 理解继承2. 继承概述3. 代码块理解4. 继承的好处与弊端5. 继承中变量的访问特点6. super关键字7. 继承中构造方法访问特点8. 继承中成员方法访问特点9. 方法重写10. 方法重写注意事项11. Java继承注意事项 1. 理解继承 2. 继承概述 1. 继承是面向对象的三大特征之一…

MySQL中的JOIN与IN:性能对比与最佳实践

文章目录 JOIN与IN的基本介绍JOININ JOIN与IN性能对比使用JOIN的查询使用IN的查询 何时使用JOIN何时使用IN性能优化的其他考虑因素总结 &#x1f389;MySQL中的JOIN与IN&#xff1a;性能对比与最佳实践 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈…