【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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Node.js】解决npm报错:RequestError: unable to verify the first certificate

1. 问题简述 帖主从nodejs官网下载安装nodejs后&#xff0c;发现使用以下命令安装electron会报错&#xff1a; npm install electron 报错信息如下&#xff1a; npm ERR! RequestError: unable to verify the first certificate 2. 解决方案 网上列举的方案&#xff0c;无…

uniapp项目打包h5,支持文件协议,使用vconsole调试移动端

uniapp项目需要打包h5&#xff0c;并且需要嵌套到一个原生的移动端项目中&#xff0c;需要支持文件协议能直接访问 打包设置 设置./基础路径 引入vconsole调试移动端 <script src"https://unpkg.com/vconsole/dist/vconsole.min.js"></script>可以将…

数字系列——数字经济(2)​

上次呢&#xff0c;已经为大家捋了什么是数字经济&#xff1f;、数字经济的特点有哪些&#xff1f;和数字经济的构成&#xff0c;对于数字经济有了基础性的了解&#xff0c;今天继续为大家捋一捋。 数字经济的发展 1.互联网的普及 互联网作为数字经济的坚实基础&#xff0c;其…

猫头虎分享ubuntu20.04下VSCode无法输入中文解决方法

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

dbCAN碳水化合物酶基因数据库及run_dbCAN4工具安装配置及使用

dbCAN&#xff08;碳水化合物酶基因数据库&#xff09;是一个专门用于在基因组中预测碳水化合物酶基因的在线工具。它基于隐马尔可夫模型&#xff08;HMM&#xff09;和BLAST搜索&#xff0c;能够在蛋白质序列中识别和注释不同类型的碳水化合物酶基因&#xff0c;包括纤维素酶、…

logcat日志的使用——Qt For Android

前言 最近一直用qt开发安卓app&#xff0c;一直无法用真机调试&#xff0c;可能是缺什么东西。但是如果通过Qt Creator在真机上运行&#xff0c;可以在电脑控制台看打印&#xff08;安卓本身的日志、qDebug之类的打印&#xff09;&#xff0c;所以我是通过打印猜测问题所在&am…

Flutter 控件查阅清单

为了方便记录和使用Flutter中的各种控件&#xff0c;特写此博客以记之&#xff0c;好记性不如烂笔头嘛&#xff1a;&#xff09; 通过控件的首字母进行查找&#xff0c;本文会持续更新 控件目录 AAppBar BCContainerColumn &#xff08;列&#xff09; DDivider (分割线) EElev…

基于安卓的2048益智游戏的设计与实现

基于安卓的2048益智类游戏的设计与实现 摘要&#xff1a;现如今随着社会日新月异&#xff0c;人们越来越离不开智能手机所提供的灵活性与便携性。安卓系统是在这股手机发展迅猛的潮流中其市场占有率过半的手机平台&#xff0c;基于安卓系统的游戏开发有着不可估量的前景。 本论…

pip安装python包(pytorch)时遇到超时现象的通用解决方案

最近在使用服务器配置pytorch环境的时候&#xff0c;遇到了极为恼火的事情&#xff0c;使用pytorch官方的命令来下载GPU版本的pytorch总会是不是下载到一半就会崩溃&#xff0c;然而pip下载并不会断点续传&#xff08;什么时候能出这个功能啊喂&#xff01;&#xff09;。每次下…

Android中实现RecyclerView,并对item及其多个子控件的点击事件监听

目录 背景 实现RecyclerView 第一步、 新建item的xml 第二步、在activity的布局中引入 RecyclerView 第三步、新建一个adapter 第四步、在activity中初始化绑定adapter即可 实现item及其多个子组件点击事件监听 第一步、 适配器中创建监听对象 第二步、适配器中绑定监听…

编码未来已然来临:无代码、低代码助力软件驱动世界

在当今时代&#xff0c;企业无不致力于探寻能够实现降本增效的有效路径。在众多热门技术中&#xff0c;AI人工智能和机器学习等概念已经被广泛采纳并应用于各行业的实际业务场景中。当企业开始树立起数字化意识&#xff0c;他们通常会选择以下两条路径中的一条来实现数字化转型…

如何运用智能安全帽、执法记录仪等技术手段提高隧道施工人员定位和安全监管效率?

应用需求 隧道中通常没有4G网络&#xff0c;无法搜到GPS卫星&#xff0c; 而领导从安全生产监管的角度&#xff0c;又需要看到现场的视频、录像、人员定位等。这正是本方案需要解决的问题。 系统特点 在无网络的隧道内部录像&#xff0c;紧急情况可派人出隧道&#xff0c;把…

SimpleCG小游戏开发系列(1)--扫雷

一、前言 前面我们学习了SimpleCG的游戏开发框架,从本篇开始,我们用一系列小游戏的开发来加深对框架的了解.我们先以windows的经典游戏--扫雷,作为首个例子。游戏预览如下 二、框架搭建 因为游戏程序的大体框架差不多&#xff0c;所以我们可以搭建一个通用的主程序。如下所示&a…

PC模糊搜索

双向绑定input输入框&#xff0c;监听值改变事件 <el-inputinput"input"v-model"queryParams.keyword"style"margin-bottom: 10px"type"text"prefix-icon"el-icon-search"size"small"placeholder"输入员工…

zookeeper集群(很少用)+kafka集群(常用)

一、zookeeper zookeeperkafka&#xff08;2.7.0版本&#xff09; kafka&#xff08;3.4.1版本&#xff09;不依赖于zookeeper 1、定义&#xff1a;zookeeper开源&#xff0c;分布式架构&#xff0c;提供协调服务&#xff08;Apache项目&#xff09;&#xff0c;基于观察者模…

【Python | 测试】assert 断言最佳实践

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

项目分享丨11行Python代码制作聊天机器人

前言 大家好&#xff0c;今天教大家如何用Python开发自己的聊天机器人&#xff0c;Python语言能做到&#xff0c;而且只需要11行代码。 一、项目思路 因为Python丰富的开源库&#xff0c;可以控制微信接收/发送消息&#xff0c;因此用python写一个简易的聊天机器人不难实现。…

JenKins快速安装与使用,Gitlab自动触发Jenkins

一、JenKins 0.准备&#xff0c;配置好环境 1&#xff09;Git&#xff08;yum安装&#xff09; 2&#xff09;JDK&#xff08;自行下载&#xff09; 3&#xff09;Jenkins&#xff08;自行下载&#xff09; 1.下载安装包 进官网&#xff0c;点Download下方即可下载。要下…

Spring Cloud Function Spel表达式注入 CVE-2022-22963 漏洞复现

Spring Cloud Function Spel表达式注入 CVE-2022-22963 漏洞复现 名称: Spring Cloud Function SPEL 远程代码执行 描述: Spring Cloud Function 是基于Spring Boot 的函数计算框架&#xff0c;它抽象出所有传输细节和基础架构&#xff0c;允许开发人员保留所有熟悉的工具和流…

open3d-点云及其操作

open3d提供了一个专门用于点云的数据结构 PointCloud。 class PointCloud(Geometry3D):color # 颜色normals # 法向量points # 点云def __init__(self, *args, **kwargs):"""__init__(*args, **kwargs)Overloaded function.1. __init__(self: open3d.cpu.py…