当前位置: 首页 > 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

http://www.lryc.cn/news/431817.html

相关文章:

  • 【深度学习】多层感知机的从零开始实现与简洁实现
  • 4、Django Admin对自定义的计算字段进行排序
  • rsync搭建全网备份
  • 网络安全售前入门09安全服务——安全加固服务
  • 【Android】GreenDao数据库的使用方式
  • 搜索算法之线性搜索详细解读(附带Java代码解读)
  • Quartz.Net_依赖注入
  • 【系统架构设计师-2011年】综合知识-答案及详解
  • World of Warcraft [CLASSIC][80][Grandel]Sapphire Hive Drone
  • Unity 对接 Android 第三方广告,App 切换到后台后,再次打开时,第三方广告被销毁导致无法触发回调逻辑的问题
  • Kafka Broker处于高负载状态(例如消息处理量大或系统资源不足),无法及时响应消费者的请求
  • 相关二叉树进阶面试题的讲解?看这一篇足矣
  • Nginx部署前端Vue项目的深度解析
  • PHP一站式解决方案高级房产系统小程序源码
  • 轻量级模型解读——EfficientNet系列
  • 深入浅出SRS—RTMP实现
  • 睿赛德科技携手先楫共创RISC-V生态|RT-Thread EtherCAT主从站方案大放异彩
  • 【Cesium实体创建】
  • 为何一些包的Priority在apt-cache和deb文件当中的不一样
  • CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)
  • nvidia-cuda-tensorrt-cudnn下载网站
  • GitLab 是什么?GitLab使用常见问题解答
  • 数字时代,寻找新的生意增长点之前要做什么准备?
  • 使用Python本地搭建http.server文件共享服务并实现公网环境远程访问——“cpolar内网穿透”
  • STM32——Flash闪存
  • python科学计算:NumPy 数组的高级操作
  • 【补-网络安全】日常运维(二)终端端口占用排查
  • 设计模式之适配器模式:软件世界的桥梁建筑师
  • Java 入门指南:Java 并发编程 —— Fork/Join 框架 实现任务的拆分与合并
  • token过期时间分平台(web和app)设置方法