Springboot @Async 多线程获取返回值

Springboot @Async 多线程获取返回值

需求背景

最近需要用到多线程, 自己维护线程池很麻烦, 正好看到Springboot集成线程池的例子, 这里自己做了个尝试和总结, 记录一下, 也分享给需要的朋友;
不考虑事务的情况下, 这个多线程实现比较简单, 主要有以下几点:

  1. 在启动类加上@EnableAsync注解, 开启异步执行支持;
  2. 编写线程池配置类, 别忘了@Configuration, 和@Bean注解;
  3. 编写需要异步执行的业务, 放到单独的类中 (可以定义为 service, 因为需要 spring 管理起来才能用 );

举栗个现实问题:

需求:拉取 业务数据不能超过 5秒。
拉取第三方数据 ,分别需要拉取 A业务数据(需要2秒) 、拉取 B业务数据(需要2秒)、拉取 C业务数据(需要2秒) ,最后再一并返回给前端。
解决方案: Executor+@Async(“参数”)+CompletableFutureFuture

上代码

1.启动类上加注解

@EnableAsync

2.配置类

其他配置请参考配置类示例

@Slf4j
//@EnableAsync//(该注解加在启动类或线程池配置类上都可以)
@Configuration
public class ThreadPoolCommonConfig extends AsyncConfigurerSupport {@Bean("asyncExecutor")public Executor asyncExecutor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();taskExecutor.setCorePoolSize(20);taskExecutor.setMaxPoolSize(100);taskExecutor.setQueueCapacity(1000);taskExecutor.setKeepAliveSeconds(60);taskExecutor.setThreadNamePrefix("asyncExecutorConfig--");taskExecutor.setWaitForTasksToCompleteOnShutdown(true);taskExecutor.setAwaitTerminationSeconds(60);taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());// MDC 装饰器  传递MDC中的信息taskExecutor.setTaskDecorator(new MdcTaskDecorator());return taskExecutor;}
}

3.异步方法(所属类需交由Spring管理)

3.1.@Async + CompletableFuture(推荐)

@Override
@Async("asyncExecutor")
public CompletableFuture<String> list(String s) {log.info("{}: {}", s, Thread.currentThread().getName());ThreadUtil.sleep(2, TimeUnit.SECONDS);log.info("{}查询列表成功", s);return CompletableFuture.completedFuture(s);
}

3.2.@Async + Future

// 异步执行的方法, 注解内为自定义线程池类名
@Override
@Async("asyncExecutor")
public Future<Integer> test(Integer i) {log.info("{}: {}", i, Thread.currentThread().getName());ThreadUtil.sleep(1, TimeUnit.SECONDS);log.info("@Async执行:{}", i);return new AsyncResult(i);
}

4.调用

4.1.CompletableFuture获取返回值(推荐)

CompletableFuture<String> future1 = testService.list("A");
CompletableFuture<String> future2 = testService.list("B");
// 阻塞所有异步线程执行完毕
CompletableFuture.allOf(future1, future2).join();
// 阻塞,直至 future1 和 future2 的异步线程执行完毕
log.info("future结果:{},{}", future1.get(), future2.get());

4.2.Future获取返回值

Future<Integer> future1 = testService.test(1);
Future<Integer> future2 = testService.test(2);
// 阻塞,直至 future1 的异步线程执行完毕
log.info("future1结果:{}", future1.get());
// 阻塞,直至 future2 的异步线程执行完毕
log.info("future1结果:{}", future2.get());

参考文档

Async注解使用和CompletableFuture注解获取返回值
Springboot @Async 多线程获取返回值
Spring Boot中调用@Async注解的异步方法并获取返回值

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

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

相关文章

iTOP-RK3568开发板Docker 安装 Ubuntu 18.04

Docker 下载安装 Ubuntu18.04&#xff0c;输入以下命令&#xff1a; sudo apt update docker pull ubuntu:18.04 切换 Shell 到 Ubuntu 18.04&#xff0c;输入以下命令&#xff1a; docker container run -p 8000:3000 -it ubuntu:18.04 /bin/bash -p 参数&#xff1a;容器的…

Ftp和UDP的区别之如何加速文件传输

FTP&#xff08;文件传输协议&#xff09;是一种传输大文件的老方法&#xff0c;它的速度慢&#xff0c;而且容易受到网络环境的影响。在当今这个文件越来越大&#xff0c;项目交付时间越来越紧&#xff0c;工作分布在全球各地的时代&#xff0c;有没有办法让 FTP 加速呢&#…

大数据课程D2——hadoop的概述

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解hadoop的定义和特点&#xff1b; ⚪ 掌握hadoop的基础结构&#xff1b; ⚪ 掌握hadoop的常见命令&#xff1b; ⚪ 了解hadoop的执行流程&#xff1b; 一、简介 1…

Java: Hutool工具包

1.IO相关的工具类 IoUtil &#xff1a; 流操作工具类Fileutil &#xff1a; 文件读写和操作的工具类FileTypeUtil &#xff1a;文件类型判断工具类watchMonitor &#xff1a; 目录、文件监听classPathResource &#xff1a; 针对ClassPath中资源的访问封装FileReader &#xf…

adnroid 11. 0 Activity启动流程图解

从Launcher到ActivityTaskManager 从ActivityTaskManagerService 到 ApplicationThread 从ApplicationThread到onCreate

Java三大特性,设计的五大原则的理解

Java三大特性分别是封装&#xff0c;继承&#xff0c;多态。 下面谈谈我对这三个特性的理解&#xff1a; 1.封装 指的是将类的成员变量(属性)和成员方法(方法)隐藏起来&#xff0c;通过使用访问修饰符(如private、public、protected等)来限制外部对类的直接访问&#xff0c;从而…

全面解析 SOCKS5 代理和 HTTP 代理在网络安全与爬虫应用中的技术对比与应用指南

一、SOCKS5 代理和 HTTP 代理的基本原理 SOCKS5 代理&#xff1a;SOCKS5 是一种网络协议&#xff0c;可以在传输层代理 TCP 和 UDP 请求。它不解析请求内容&#xff0c;仅在客户端和代理服务器之间建立连接&#xff0c;并转发数据。SOCKS5 代理支持众多网络协议和端口类型&…

mac 安装 php 与 hyperf 框架依赖的扩展并启动 gptlink 项目

m系列 mac 安装 php 与 hyperf 框架依赖的扩展并启动 gptlink 项目 gptlink 项目是一个前后端一体化的 chatgpt 开源项目 gptlink 项目地址&#xff1a;https://github.com/gptlink/gptlink 安装 php 8.0 版本&#xff1a; brew install php8.0安装完成后提示如下&#xff…

uniapp 语音文本播报功能

最近uniapp项目上遇到一个需求 就是在接口调用成功的时候加上语音播报 &#xff0c; ‘创建成功’ ‘开始成功’ ‘结束成功’ 之类的。 因为是固定的文本 &#xff0c;所以我先利用工具生成了 文本语音mp3文件&#xff0c;放入项目中&#xff0c;直接用就好了。 这里用到的工…

Rust vs Go:常用语法对比(十一)

题目来自 Rust Vs Go: Which Language Is Better For Developing High-Performance Applications?[1] 202. Sum of squares Calculate the sum of squares s of data, an array of floating point values. 计算平方和 package mainimport ( "math")func main() { da…

OpenCV 4.0+Python机器学习与计算机视觉实战

&#x1f482; 个人网站:【办公神器】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言第一部分&…

TypeScript入门学习汇总

1.快速入门 1.1 简介 TypeScript 是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 标准。 TypeScript 由微软开发的自由和开源的编程语言。 TypeScript 设计目标是开发大型应用&#xff0c;它可以编译成纯 JavaScript&#xff0c;编译出来的 JavaScript 可以运行在…

HTTP超本文传输协议

HTTP超本文传输协议 HTTP简介HTTP请求与响应HTTP请求请求行请求头空行请求体 HTTP响应响应行响应头空行响应体 HTTP请求方法GET和POST之间的区别HTTP为什么是无状态的cookie原理session 原理cookie 和 session 的区别cookie如何设置cookie被禁止后如何使用session HTTP简介 HT…

论文阅读与管理方法论

文章目录 为什么读论文论文类型综述论文专题论文 论文质量角度关于如何找论文的小Tips如何整理论文读论文的困境如何读论文不同人群阅读差异读论文三部曲&#xff1a;泛读、精读、总结泛读&#xff1a;快速浏览&#xff0c;把握概要。泛读目标及效果自测 精读&#xff1a;选出精…

MS1826B HDMI 1进4出 视频拼接芯片

MS1826B 是一款多功能视频处理器&#xff0c;包含 4 路独立 HDMI 音视频输出通道、1 路 HDMI 音视 频输入通道以及 1 路独立可配置为输入或者输出的 SPDIF、I2S 音频信号。支持 4 个独立的字库定 制型 OSD&#xff1b;可处理隔行和逐行视频或者图形输入信号&#xff1b;有四路独…

-jar和 javaagent命令冲突吗?

当使用 -jar 命令运行 Java 应用程序时&#xff0c;Java 虚拟机 (JVM) 会忽略任何设置的 -javaagent 命令。这是因为 -jar 命令会覆盖其他命令行选项&#xff0c;包括 -javaagent。 这是因为 -jar 命令是用于运行打包为 JAR 文件的 Java 应用程序的快捷方式。它会忽略其他命令…

(原创)Flutter与Native通信的方式:MethodChannel

前言 随着Flutter混合开发的项目越来越多&#xff0c;我们也有了实际的一个场景&#xff0c; 那就是Flutter如何与原生&#xff08;Native&#xff09;端进行通信 目前看来&#xff0c;大概有三种方式&#xff0c;分别是&#xff1a; MethodChannel EventChannel MessageChann…

Redis配置与优化

目录 一、关系数据库与非关系型数据库 1、关系型数据库 2、非关系型数据库 3、关系型数据库和非关系型数据库区别 1、数据存储方式不同 2、扩展方式不同 3、对事务性的支持不同 二、Redis 1、简介 2、优点 3、缺点 4、使用场景 5、哪些数据适合放入缓存中 6、为什…

vue-cli脚手架创建创建的项目打包后无法正常打开报 Failed to load resource: net::ERR_FILE_NOT_FOUND错误

亲爱的小伙伴们&#xff0c;你们最近是否有遇到用使用最新的脚手架打包项目后index.html文件无法正常打开&#xff0c;然后控制台报错的情况呢&#xff0c;不要担心&#xff0c;这个坑今天被我踩到了并且被我解决了&#xff0c;下边就让我来给大家分享一下经验吧&#xff01; …

D. Maximum Subarray

Problem - 1796D - Codeforces 思路&#xff1a;想了个假dp做法推了半天&#xff0c;果然是dp。考虑用dp[i][j]表示以i结尾的&#xff0c;并且选择j个&#xff0b;x的最长连续子序列&#xff0c;那么如果我不选择第i位&#xff0c;那么会有f[i][j]max(w[i]-x,f[i-1][j]w[i]-x)&…