springboot中的异步任务

news2024/11/16 1:50:38

在springboot项目中可以通过@EnableAsync+@Async的方式简化异步操作,下文使用springboot:3.2.1 源码分析

若一个bean中的公共方法上标注了@Async,在系统启动时,会给这个类创建一个代理对象,并将该代理对象作为bean注册到spring容器中
当调用带有@Async注解的方法时,实际上是调用了代理对象的方法,在代理对象的方法中将真正的方法交给线程池去执行

原理分析

代理方法执行时,AsyncExecutionInterceptor#invoke调用determineAsyncExecutor()方法获取异步执行器,然后将真实方法的执行交给异步执行器
在这里插入图片描述
获取@Async指定的异步执行器,若未指定,则使用默认的异步执行器
在这里插入图片描述

获取默认的异步执行器

  • 默认的异步执行器类型是ThreadPoolTaskExecutor,由org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations.TaskExecutorConfiguration向spring容器中注册
  • 且核心线程数默认是8,阻塞队列容量默认是Integer.MAX_VALUE,可见默认的设置在生产环境使用时存在资源耗尽的风险。可通过配置文件调整(配置项对应类:org.springframework.boot.autoconfigure.task.TaskExecutionProperties)

如果AsyncConfigurer提供了Executor,则使用该Executor作为默认执行器,否则通过getDefaultExecutor方法获取默认执行器
在这里插入图片描述
AsyncExecutionInterceptor#getDefaultExecutor方法中,首先从父类方法中获取执行器(从spring容器中获取org.springframework.core.task.TaskExecutor类型的bean或者name是taskExecutor的bean),若为空,则使用SimpleAsyncTaskExecutor
在这里插入图片描述
在这里插入图片描述
默认情况下,spring容器中并没有TaskExecutor类型的bean,但是在TaskExecutorConfiguration(该配置类是由TaskExecutionAutoConfiguration自动配置类使用@Import导入)配置类中,向spring容器中注册了name是taskExecutor的bean
在这里插入图片描述

自定义异步执行器

自定义默认异步执行器

以下两种方式都是在自定义默认的异步执行器,也就说@Async不指定线程池时使用的默认异步执行器

  1. 自定义配置类,并实现org.springframework.scheduling.annotation.AsyncConfigurer接口,重写getAsyncExecutor方法
  2. 向容器中注册TaskExecutor类型的bean,覆盖内置的TaskExecutor
自定义普通异步执行器
  • 自定义普通异步执行器的bean名称,不可设置为taskExecutor,且类型不可以是TaskExecutor,否则会成为默认异步执行器
  • 可创建org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor对象,并自定义其属性值,然后将该对象注册到spring容器中

异常处理

异步方法的异常捕获和处理
在这里插入图片描述
在这里插入图片描述
默认的异常处理器SimpleAsyncUncaughtExceptionHandler
在这里插入图片描述
在这里插入图片描述
示例

2024-09-20T15:59:20.776+08:00 ERROR 34764 --- [         task-1] .a.i.SimpleAsyncUncaughtExceptionHandler : Unexpected exception occurred invoking async method: public void com.example.box.dynamicproxy.TestJdkProxyServiceImpl.run()

java.lang.RuntimeException: 公司又停发工资了!!!
	at com.example.box.dynamicproxy.TestJdkProxyServiceImpl.run(TestJdkProxyServiceImpl.java:14) ~[classes/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]

自定义异常处理器

配置类实现AsyncConfigurer接口的getAsyncUncaughtExceptionHandler()方法,返回一个自定义的AsyncUncaughtExceptionHandler实现类的实例
在这里插入图片描述

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

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

相关文章

PyTorch 模型调试与故障排除指南

在当代深度学习领域,PyTorch 已成为开发和训练神经网络的主要框架之一。然而随着模型复杂度的增加和数据规模的扩大,开发者常常面临各种调试和优化挑战。本文旨在为 PyTorch 开发者提供一个全面的调试指南,涵盖从基础概念到高级技术的广泛内容…

2024双11买什么东西比较好?2024双十一好物推荐

双十一各种爆款商品,打折商品非常多,容易让人挑花眼也容易落入消费主义的陷阱,买回家后发现并不实用,甚至可能是自己平常生活中根本用不上的东西!即使是打折活动也要在购买前考虑一下自己是否需要,在日常生…

DAMODEL——创建云实例与部署深度学习模型的详细指南

使用 DAMODEL 控制台创建云实例与部署深度学习模型的详细指南 本文将逐步介绍如何使用 DAMODEL 控制台创建云实例、配置 SSH 密钥、上传与下载数据集、以及基于 UNet 网络进行眼底血管分割的完整流程。此指南适用于需要在云端进行深度学习训练的用户,提供详细的操作…

YOLOv10改进,YOLOv10主干网络替换为FasterNet(全网独发手把手教学,助力涨点)

摘要 近年来,许多研究致力于减少浮点运算(FLOPs)以加速神经网络。然而,我们观察到这种FLOPs的减少并不一定能带来相应的延迟减少。这主要是由于运算每秒浮点运算数(FLOPS)效率低下,尤其是在频繁的内存访问(如深度卷积)时。为了解决这一问题,提出了一种新的部分卷积(…

如何快速上手一个Github的开源项目

程序研发领域正是有一些热衷开源的小伙伴,技能迭代才能如此的迅速,因此,快速上手一个GitHub上的开源项目,基本上已经变成很个程序员小伙伴必须掌握的技能,因为终究你会应用到其中的一个或多个项目,帮助自己…

<刷题笔记> 二叉搜索树与双向链表注意事项

二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com) 根据题意,我们需要将搜索二叉树转换成有序的形式。 重点一:BST的中序遍历一定是有序的 因此,此题无论如何都需要使用中序。 又因为要求原地算法,所以: 重点二&a…

Oracle AI理论与实践,企业落地篇干货满满

最近也是看到了圈子里的一位DBA好友,领导安排的工作是让负责AI的落地,而且也作为他业绩考核的指标,作为1名15年的DBA老兵来说,让AI落地面临的困难重重。 AI已经逐渐侵入到实际的生活中,最近我也是参加了Oracle官方在中…

大模型下载、本地部署和调用攻略

零、下载大模型——以Qwen/Qwen2.5-7B为例 1、下载前的准备工作 1.1 仔细阅读模型的Model card介绍 里面会有支持的上下文长度、模型结构、参数量等基本信息 1.2 查看模型文件 Tokenizer相关的文件: merges.txt:这是用于Byte Pair Encoding&#xff…

git笔记之重置本地仓库所有分支和远程保持一致、工作区恢复干净,像刚clone下来一样

git笔记之重置本地仓库所有分支和远程保持一致、工作区恢复干净,像刚clone下来一样 code review! 文章目录 git笔记之重置本地仓库所有分支和远程保持一致、工作区恢复干净,像刚clone下来一样1.实现该功能的 Bash 脚本示例2.改进版:增加了gi…

【第十八章:Sentosa_DSML社区版-机器学习之协同过滤】

【第十八章:Sentosa_DSML社区版-机器学习之协同过滤】 1.算子介绍 协同过滤是推荐系统中常用的一种方法。该算法旨在填补用户-产品关联矩阵中缺少的项。在算法中,用户和产品都是通过一组少量的潜在因素描述,这些潜在因素可以用于预测用户-产…

彻底掌握Android中的ViewModel

彻底掌握Android中的ViewModel ViewModel 属于Android Jetpack库的一部分,是一种业务逻辑或屏幕状态容器。它提供了在配置更改(如屏幕旋转)后依旧保留相应状态的特性,帮助开发者以更加清晰和可维护的方式处理UI相关的数据&#x…

MySQL安装文档-Windows

文章目录 MySQL安装1. 安装2. 配置 MySQL安装 1. 安装 1). 双击官方下来的安装包文件 2). 根据安装提示进行安装 安装MySQL的相关组件,这个过程可能需要耗时几分钟,耐心等待。 输入MySQL中root用户的密码,一定记得记住该密码 2. 配置 安装好MySQL之后…

从零开始构建GPT风格的LLM分类器 微调GPT模型进行垃圾邮件分类

在这篇文章中,我想向您展示如何将预训练的大型语言模型(LLM)转变为强大的文本分类器。 为什么专注于分类? 首先,将预训练模型微调为分类器提供了一种温和而有效的微调入门方式。其次,许多现实世界和商业挑…

SpringBoot技术栈的网上超市开发实践

2 系统开发技术 这部分内容主要介绍本系统使用的技术,包括使用的工具,编程的语言等内容。 2.1 Java语言 Java语言自公元1995年至今,已经超过25年了,依然在软件开发上面有很大的市场占有率。当年Sun公司发明Java就是为了发展一门跨…

python类的call方法与init方法

1. call方法 在对象被调用了的时候就会调用call方法a(666) class A:def __call__(self, args):print(call 方法被调用了,args) aA() a(666) 2.init方法 创建对象的时候 init 方法被调用 class A:def __init__(self,args):print(创建对象的时候 init 方法被调用了,args) aA(…

shardingjdbc-读写分离配置

文章目录 1、application.yml2、shardingsphere.yaml3、创建实体类 User4、创建 UserMapper5、添加依赖6、读写分离测试7、事务测试 我们的主从复制已经提前搭建好: mysql-搭建主从复制:https://blog.csdn.net/m0_65152767/article/details/142214434 1…

使用 Python 模拟光的折射,反射,和全反射

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【一句话点破】【C++重要题目】基类与派生类的成员变量值被对象调用的结果(二)

【一句话点破】基类/派生类的成员变量由哪个对象初始化的&#xff0c;哪个对象调用该成员变量时就用由它初始化的值 [尤其找准是基类对象or派生类对象的值] 【重要例题】15浙工大卷二读程序5题 可运行代码如下 #include "bits/stdc.h" #include<iostream> u…

畅阅读微信小程序

畅阅读微信小程序 weixin051畅阅读微信小程序ssm 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用j…

CVE-2024-1112 Resource Hacker 缓冲区溢出分析

漏洞简述 CVE-2024-1112 是 Resource Hacker 软件的一个缓冲区溢出漏洞。该漏洞存在于版本 3.6.0.92 中。由于软件在处理命令行中的文件路径时未对文件字符串长度进行限制&#xff0c;过长的字符串参数导致内存被过度写入&#xff0c;从而引发缓冲区溢出。 漏洞复现 构造长度…