SpringBoot中使用异步方法优化Service逻辑,提高接口响应速度

本文介绍了在SpringBoot中如何利用内置的异步注解和自定义线程池实现方法异步执行,包括使用`@Async`进行默认线程池调用,以及如何通过实现`AsyncConfigurer`接口自定义线程池和异常处理器。
摘要由CSDN通过智能技术生成

SpringBoot中使用异步方法优化Service逻辑,提高接口响应速度

2. SpringBoot中的异步方法支持

======================

其实, 在SpringBoot中并不需要我们自己去创建维护线程或者线程池来异步的执行方法, SpringBoot已经提供了异步方法支持注解.

@EnableAsync // 使用异步方法时需要提前开启(在启动类上或配置类上)

@Async // 被async注解修饰的方法由SpringBoot默认线程池(SimpleAsyncTaskExecutor)执行

比如使用Spring的异步支持实现文章查询并增加阅读量

Service层:

@Service

public class ArticleServiceImpl {

// 查询文章

public String selectArticle() {

// TODO 模拟文章查询操作

System.out.println(“查询任务线程”+Thread.currentThread().getName());

return “文章详情”;

}

// 文章阅读量+1

@Async

public void updateReadCount() {

// TODO 模拟耗时操作

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“更新任务线程”+Thread.currentThread().getName());

}

}

Controller层:

@RestController

public class AsyncTestController {

@Autowired

private ArticleServiceImpl articleService;

/**

  • 模拟获取文章后阅读量+1

*/

@PostMapping(“/article”)

public String getArticle() {

// 查询文章

String article = articleService.selectArticle();

// 阅读量+1

articleService.updateReadCount();

System.out.println(“文章阅读业务执行完毕”);

return article;

}

}

测试结果: 我们可以感受到接口响应速度大大提升, 而且从日志中key看到两个执行任务是在不同的线程中执行的

SpringBoot中使用异步方法优化Service逻辑,提高接口响应速度

3. 自定义线程池执行异步方法

================

SpringBoot为我们默认提供了线程池(SimpleAsyncTaskExecutor)来执行我们的异步方法, 我们也可以自定义自己的线程池.

第一步配置自定义线程池

@EnableAsync // 开启多线程, 项目启动时自动创建

@Configuration

public class AsyncConfig {

@Bean(“customExecutor”)

public ThreadPoolTaskExecutor asyncOperationExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

// 设置核心线程数

executor.setCorePoolSize(8);

// 设置最大线程数

executor.setMaxPoolSize(20);

// 设置队列大小

executor.setQueueCapacity(Integer.MAX_VALUE);

// 设置线程活跃时间(秒)

executor.setKeepAliveSeconds(60);

// 设置线程名前缀+分组名称

executor.setThreadNamePrefix(“AsyncOperationThread-”);

executor.setThreadGroupName(“AsyncOperationGroup”);

// 所有任务结束后关闭线程池

executor.setWaitForTasksToCompleteOnShutdown(true);

// 初始化

executor.initialize();

return executor;

}

}

第二步, 在@Async注解上指定执行的线程池即可

// 文章阅读量+1

@Async(“customExecutor”)

public void updateReadCount() {

// TODO 模拟耗时操作

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“更新文章阅读量线程”+Thread.currentThread().getName());

}

5. 如何捕获(无返回值的)异步方法中的异常

=======================

以实现AsyncConfigurer接口的getAsyncExecutor方法和getAsyncUncaughtExceptionHandler方法改造配置类

自定义异常处理类CustomAsyncExceptionHandler

@EnableAsync // 开启多线程, 项目启动时自动创建

@Configuration

public class AsyncConfig implements AsyncConfigurer {

@Override

public Executor getAsyncExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

// 设置核心线程数

executor.setCorePoolSize(8);

// 设置最大线程数

executor.setMaxPoolSize(20);

// 设置队列大小

executor.setQueueCapacity(Integer.MAX_VALUE);

// 设置线程活跃时间(秒)

executor.setKeepAliveSeconds(60);

// 设置线程名前缀+分组名称

executor.setThreadNamePrefix(“AsyncOperationThread-”);

executor.setThreadGroupName(“AsyncOperationGroup”);

// 所有任务结束后关闭线程池

executor.setWaitForTasksToCompleteOnShutdown(true);

// 初始化

executor.initialize();

return executor;

}

@Override

public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {

return new CustomAsyncExceptionHandler();

}

}

public class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

@Override

public void handleUncaughtException(Throwable throwable, Method method, Object… obj) {

System.out.println(“异常捕获---------------------------------”);

System.out.println("Exception message - " + throwable.getMessage());

System.out.println("Method name - " + method.getName());

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

image

高效学习视频

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
=“img” style=“zoom: 33%;” />

更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

[外链图片转存中…(img-F9dThIKM-1713311721946)]

高效学习视频

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值