当前位置: 首页 > news >正文

【日常记录-Java】SpringBoot中使用无返回值的异步方法

Author:赵志乾
Date:2024-09-05
Declaration:All Right Reserved!!!

1. 简介

        在SpringBoot中,使用@Async注解可以很方便地标记一个方法为异步执行。好处是调用者无需等待这些方法完成便可继续执行其他任务,从而提高应用程序的响应性和吞吐量。

2. 步骤

  2.1 启用异步支持

        在配置类上添加@EnableAsync注解来启用异步支持。代码如下:

@Configuration  
@EnableAsync  
public class AsyncConfig {  }
  2.2 配置线程池

        SpringBoot默认使用SimpleAsyncTaskExecutor来执行异步任务,其每次会创建一个新的线程来执行任务,从而导致大量线程被创建,效率低下。为此,可通过配置一个自定义线程池来执行@Async方法。代码如下:

@Configuration  
@EnableAsync  
public class AsyncConfig {  @Beanpublic ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(10);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}
}
  2.3 @Async注解标注异步方法

        异步方法需要Spring的管理,故其必须在Bean内定义。代码如下:

@Service  
public class AsyncService {  @Async  public void executeAsyncTask() {  try {  Thread.sleep(5000);       // 假设这个任务需要5秒钟来完成  } catch (InterruptedException e) {  Thread.currentThread().interrupt();  }  System.out.println("异步任务执行完成");  }  
}
  2.4 异步方法调用

        异步方法在另一个Bean内调用,可直接使用。代码如下:

@Service
public class CustomService{@Resourceprivate AsyncService asyncService;public void execute(){// 自定义逻辑// 异步调用asyncService.executeAsyncTask();// 自定义逻辑}
}

        注意:异步方法调用不要在同一Bean内进行,即异步方法和调用异步方法的方法位于同一Bean内,此时将无法使用代理完成异步操作。即使通过AopContext获取代理方式进行调用,也会产生如下错误:

ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Docker基础-Docker Compose使用
  • 大数据与人工智能:脑科学与人工神经网络ANN
  • 随手记:uniapp小程序登录方式和小程序使用验证码登录
  • Flutter动画—涟漪效果
  • arcgis Feature Server的新增、更新、删除
  • 使用 Grype 检查 .jar 包中的漏洞
  • Python 调用手机摄像头
  • Flask 第二课 -- 安装
  • 常见文档工具对比和选择
  • 解锁SQL基础应用新境界:从入门到精通的扩展实践指南(SQL扩展)
  • 1765asp.net古镇旅游网站VS开发sqlserver数据库web结构c#编程web网页设计
  • 华为OD机试真题 - 抢7游戏(Python/JS/C/C++ 2024 D卷 100分)
  • 小琳AI课堂:Nezha模型:基于Transformer的中文预训练语言模型优化与进展
  • ​数据链路层——流量控制可靠传输机制 ​
  • 高职人工智能训练师边缘计算实训室解决方案
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 0x05 Python数据分析,Anaconda八斩刀
  • 2017年终总结、随想
  • gitlab-ci配置详解(一)
  • JSDuck 与 AngularJS 融合技巧
  • js递归,无限分级树形折叠菜单
  • 产品三维模型在线预览
  • 初探 Vue 生命周期和钩子函数
  • 动态规划入门(以爬楼梯为例)
  • ------- 计算机网络基础
  • 简析gRPC client 连接管理
  • 浅谈Golang中select的用法
  • 区块链技术特点之去中心化特性
  • 驱动程序原理
  • 如何编写一个可升级的智能合约
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用Swoole加速Laravel(正式环境中)
  • 算法之不定期更新(一)(2018-04-12)
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #Ubuntu(修改root信息)
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (3)nginx 配置(nginx.conf)
  • (70min)字节暑假实习二面(已挂)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (第二周)效能测试
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (学习总结16)C++模版2
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)winform之ListView
  • (轉)JSON.stringify 语法实例讲解
  • *上位机的定义
  • .NET C# 配置 Options
  • .net core 的缓存方案
  • .NET Remoting学习笔记(三)信道
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net 中Partitioner static与dynamic的性能对比