SpringBoot整合异步任务执行

同步任务:

同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等

并发问题

同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用

户体验

异步任务:

异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源利用

率高,用户体验好

异步任务需要创建额外的线程来执行任务操作,可以使用线程池技术,灵活配置线程资源,以提高

系统的资源利用率

应该场景:比如用户的操作日志,我操作完之后还需要去执行日志记录,这个时候如果日志记录比较慢,那么用户就需要一直等待,体验感较差,我们应该开启一个新的线程去执行日志记录,返回给用户操作成功。比较经典应用就是下单。

调用python程序,我这边不可能一直等待python程序调用,给调用的代码加一个异步处理,直接返回给前端调用成功,对于python代码的调用结果可以通过websocket推送到前端去。

springBoot框架使用异步

在启动类上加上注解
@EnableAsync  // 启用异步任务支持
在需要异步的方法上面添加注解
 @Asyncpublic  void  print() throws InterruptedException {Thread.sleep(3000);System.out.println("这是执行的异步方法"+System.currentTimeMillis());}

调用异步方法

@Autowired
private testService testService;
@SneakyThrows //这个是抛异常的
@GetMapping("/hello")
public String  asny(){System.out.println("hello world");testService.print();return "hello"+System.currentTimeMillis();
}

注意异步方法不能和调用的方法同一个类中,否则异步不会生效。

使用了异步之后,方法会直接返回,下面的操作会在后面慢慢执行。

  • 异步调用必须通过代理: 确保异步方法是在不同的 Spring 管理的 bean 中调用,而不是在同一个类中直接调用。
  • 启用异步功能: 在启动类中添加 @EnableAsync 注解,以启用 Spring 的异步功能。

配置自定义线程池


**默认情况下,Spring Boot 使用一个简单的线程池来执行异步任务。如果你需要更复杂的配置,例如增加线程池大小或设置线程名称前缀,可以自定义 **Executor**。 **

package com.njitzx.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration //交给spring容器管理
public class AsyncConfig implements AsyncConfigurer {@Bean(name = "asyncExecutor")public Executor asyncExecutor() {// 定义线程池,使用Spring提供的ThreadPoolTaskExecutorThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10); // 核心线程数executor.setMaxPoolSize(20); // 最大线程数executor.setQueueCapacity(50); // 缓冲队列大小executor.setKeepAliveSeconds(60); // 线程的空闲时间executor.setThreadNamePrefix("AsyncTaskExecutor-"); // 线程前缀executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy()); // 拒绝处理策略,交由调用方线程运行executor.initialize(); // 初始化return executor;}@Overridepublic Executor getAsyncExecutor() {return asyncExecutor();}
}

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

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

相关文章

VirtualBox+Vagrant快速搭建Centos7系统【最新详细教程】

VirtualBoxVagrant快速搭建Centos7系统 📖1.安装VirtualBox✅下载VirtualBox✅安装 📖2.安装Vagrant✅下载Vagrant✅安装 📖3.搭建Centos7系✅初始化Vagrantfile文件生成✅启动Vagrantfile文件✅解决 vagrant up下载太慢的问题✅配置网络ip地…

咸鱼sign逆向分析与爬虫实现

目标:🐟的搜索商品接口 这个站异步有点多,好在代码没什么混淆。加密的sign值我们可以通过搜索找到位置 sign值通过k赋值,k则是字符串拼接后传入i函数加密 除了开头的aff…,后面的都是明文没什么好说的,我…

SysML案例-电磁轨道炮

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 图片示例摘自intercax.com,作者是Intercax公司总裁Dirk Zwemer博士。

C题(六) 1到 100 的所有整数中出现多少个数字9

场景:编写程序数一下 1到 100 的所有整数中出现多少个数字9 控制循环的变量不可以随意改动!!! 控制循环的变量不可以随意改动!!! 控制循环的变量不可以随意改动!!&#x…

看480p、720p、1080p、2k、4k、视频一般需要多大带宽呢?

看视频都喜欢看高清,那么一般来说看电影不卡顿需要多大带宽呢? 以4K为例,这里引用一位网友的回答:“视频分辨率4092*2160,每个像素用红蓝绿三个256色(8bit)的数据表示,视频帧数为60fps,那么一秒…

数据结构--二叉树的顺序实现(堆实现)

引言 在计算机科学中,二叉树是一种重要的数据结构,广泛应用于各种算法和程序设计中。本文将探讨二叉树的顺序实现,特别是堆的实现方式。 一、树 1.1树的概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成…

C#串口温度读取

背景:每天学点,坚持 要安装好虚拟串口和modbus poll,方便调试(相关资源在文末,也可以私信找我要) 传感器部分使用的是达林科技的DL11B-MC-D1,当时42软妹币买的(官网上面有这个传感…

若依--文件上传前端

前端 ry的前端文件上传单独写了一个FileUpload.Vue文件。在main.js中进行了全局的注册,可以在页面中直接使用文件上传的组件。全局导入 在main.js中 import 组件名称 from /components/FileUpLoadapp.compoent(组件名称) //全局挂载组件在项目中使用 组件命令 中…

828华为云征文|华为云 Flexus X 实例之家庭娱乐中心搭建

话接上文《828华为云征文|华为云Flexus X实例初体验》,这次我们利用手头的 Flexus X 实例来搭建家庭影音中心和密码管理环境。 前置环境 为了方便小白用户甚至运维人员,我觉得现阶段的宝塔面板 和 1Panel 都是不错的选择。我这里以宝塔为例…

GPTQ vs AWQ vs GGUF(GGML) 速览和 GGUF 文件命名规范

简单介绍一下四者的区别。 参考链接:GPTQ - 2210.17323 | AWQ - 2306.00978 | GGML | GGUF - docs | What is GGUF and GGML? 文章目录 GPTQ vs AWQ vs GGUF(GGML) 速览GGUF 文件命名GGUF 文件结构文件名解析答案 附录GGUF 文件命名GGUF 文件…

Resdis中关于字符串类型的基础命令

本文主要详解key-value中vaule为字符串类型的情况,value属于其他的数据类型不适应;有几个命令是通用命令 目录 1.set和get 2.keys 3.exists 4.del 5.expire 6.ttl 7.type 8.object encoding key 9.加减操作 10.字符串操作 11.命令小结 1.se…

DCGAN生成漫画头像

tutorials/application/source_zh_cn/generative/dcgan.ipynb MindSpore/docs - Gitee.com 在下面的教程中,我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中,使用的动漫头像数据集共有70,17…

python UNIT 3 选择与循环(2)

目录 1。循环的优化 经典优化分析: 未优化的代码: 细节分析: 优化后的代码: 优化的细节: 性能对比 优化的关键在于: 经典习题讲解:(紫色的解析请重点关注一下) 1。例三 个人代码解析…

SpringMVC源码-AbstractUrlHandlerMapping处理器映射器将实现Controller接口的方式定义的路径存储进去

DispatcherServlet的initStrategies方法用来初始化SpringMVC的九大内置组件 initStrategies protected void initStrategies(ApplicationContext context) {// 初始化 MultipartResolver:主要用来处理文件上传.如果定义过当前类型的bean对象,那么直接获取&#xff0…

随笔(四)——代码优化

文章目录 前言1.原本代码2.新增逻辑3.优化逻辑 前言 原逻辑:后端data数据中返回数组,数组中有两个对象,一个是属性指标,一个是应用指标,根据这两个指标展示不同的多选框 1.原本代码 getIndicatorRange(indexReportLi…

java集合 -- 面试

Java集合框架体系 ArrayList底层实现是数组 LinkedList底层实现是双向链表 HashMap的底层实现使用了众多数据结构,包含了数组、链表、散列表、红黑树等 List ps : 数据结构 -- 数组 ArrayList源码分析 ArrayList底层的实现原理是什么? ArrayList list new…

第二十一章 (动态内存管理)

1. 为什么要有动态内存分配 2. malloc和free 3. calloc和realloc 4. 常⻅的动态内存的错误 5. 动态内存经典笔试题分析 6. 总结C/C中程序内存区域划分 1.为什么要有动态内存管理 我们目前已经掌握的内存开辟方式有 int main() {int num 0; //开辟4个字节int arr[10] …

Django 配置邮箱服务,实现发送信息到指定邮箱

一、这里以qq邮箱为例,打开qq邮箱的SMTP服务 二、django项目目录设置setting.py 文件 setting.py 添加如下内容: # 发送邮件相关配置 EMAIL_BACKEND django.core.mail.backends.smtp.EmailBackend EMAIL_USE_TLS True EMAIL_HOST smtp.qq.com EMAIL…

828华为云征文|部署多功能集成的协作知识库 AFFiNE

828华为云征文|部署多功能集成的协作知识库 AFFiNE 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 AFFiNE3.1 AFFiNE 介绍3.2 AFFiNE 部署3.3 AFFiNE 使用 四、…

Win10之解决:设置静态IP后,为什么自动获取动态IP问题(七十八)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…