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

【Java】SpringBoot中实现异步编程

前言

首先我们来看看在Spring中为什么要使用异步编程,它能解决什么问题?

什么是异步?

首先我们先来看看一个同步的用户注册例子,流程如下:
在这里插入图片描述

异步的方式如下:
在这里插入图片描述

在用户注册后将成功结果返回,使用异步的方式来赠送优惠券,接下来我们来看一下代码示例。

示例

第一步:新建配置类,开启@Async功能支持
使用@EnableAsync来开启异步任务支持,@EnableAsync注解可以直接放在SpringBoot启动类上,也可以单独放在其他配置类上。我们这里选择使用单独的配置类SyncConfiguration

新建配置类AsyncConfiguration

@Configuration
@EnableAsync
public class AsyncConfiguration {
}

第二步:在方法上标记异步调用
增加一个Component类,用来进行业务处理,同时添加@Async注解,代表该方法为异步处理。

@Component
public class MemberServiceAsync {private static Logger logger = Logger.getLogger(MemberServiceAsync.class);@Asyncpublic void sendCoupons() {try {logger.info("发送优惠券");Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}}
}

第三步:在Controller中进行异步方法调用

@RestController
public class MemberService {private static Logger logger = Logger.getLogger(MemberService.class);@Resourceprivate MemberServiceAsync async;@RequestMapping("insertMember")public String insertMember() {logger.info("会员新增数据");async.sendCoupons();return "注册成功";}
}

访问该接口并查看控制台信息

[INFO ] 2023-03-09 19:52:04,433 method:com.mayikt.service.MemberService.insertMember(MemberService.java:19)
会员新增数据
[INFO ] 2023-03-09 19:52:04,439 method:com.mayikt.service.MemberService.insertMember(MemberService.java:21)
注册成功
[INFO ] 2023-03-09 19:52:04,446 method:com.mayikt.service.MemberServiceAsync.sendCoupons(MemberServiceAsync.java:25)
发送优惠券

通过日志可以看到:主线程不需要等待异步方法执行完成,减少了响应时间,提高了接口性能。

通过上面三步我们就可以在SpringBoot中欢乐的使用异步方法来提高我们接口性能了

线程池

为异步操作提供一个线程池,我们在配置类中加上代码

@Configuration
@EnableAsync
public class AsyncConfiguration {@Bean(name = "asyncPoolTaskExecutor")public ThreadPoolTaskExecutor executor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();//核心线程数taskExecutor.setCorePoolSize(10);//线程池维护线程的最大数量,只有在缓冲队列满了之后才会申请超过核心线程数的线程taskExecutor.setMaxPoolSize(100);//缓存队列taskExecutor.setQueueCapacity(50);//许的空闲时间,当超过了核心线程出之外的线程在空闲时间到达之后会被销毁taskExecutor.setKeepAliveSeconds(200);//异步方法内部线程名称taskExecutor.setThreadNamePrefix("async-");/*** 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略* 通常有以下四种策略:* ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。* ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。* ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)* ThreadPoolExecutor.CallerRunsPolicy:重试添加当前的任务,自动重复调用 execute() 方法,直到成功*/taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());taskExecutor.initialize();return taskExecutor;}
}

在注解上指定bean的名称:@Async(“asyncPoolTaskExecutor”)就可以了

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

相关文章:

  • ASCII 文件与 TIFF 文件互转(Python 实现)(2023/03/09)
  • 思科模拟器 | 交换机与路由器的配置汇总【收藏备用】
  • 电子台账:软件运行环境要求与功能特点
  • 计算机科学导论笔记(六)
  • 嵌入式从业10年,聊聊我对工业互联网和消费物联网的看法 | 文末赠书4本
  • python的django框架从入门到熟练【保姆式教学】第一篇
  • 浏览记录或者购物车的去重处理
  • Ubantu docker学习笔记(二)拉取构建,属于你的容器
  • 指针数组 数组指针 常量指针 指针常量 函数指针 指针函数
  • 前端js学习
  • “华为杯”研究生数学建模竞赛2007年-【华为杯】A题:食品卫生安全保障体系数学模型及改进模型(附获奖论文)
  • 转战C#---day2
  • 【vue2源码学习】— diff
  • 更换 Linux 自带的 jdk 环境
  • MySQL8读写分离集群
  • 蓝桥冲刺31天之第七天
  • 【Python百日进阶-Web开发-Vue3】Day550 - Vue3 商城后台 10:Veux4-02基本使用
  • ESP32驱动-红外寻迹传感器驱动
  • 【TS】TypeScript泛型 T 的用法详解
  • Vue 3.0 单文件组件 【Vue3 从零开始】
  • 北邮22信通:你是不是在looking for……那串代码?(2)第三章单链表
  • 蓝库云|告诉你传统产业该如何进行数字化转型
  • 121.(leaflet篇)leaflet结合echarts4迁徙图
  • 链表及其基本操作
  • 【Java基础 下】 031 -- 反射 动态代理
  • springcloud3 GateWay
  • 万字长文:Stable Diffusion 保姆级教程
  • WAMP搭建靶场
  • Uipath Excel 自动化系列13-ForEachExcelSheet(遍历Sheet)
  • JDBC快速入门