详解springboot中使用异步的常用两种方式及其比较
作者:万米高空 发布时间:2021-06-16 17:43:29
一般对于业务复杂的流程,会有一些处理逻辑不需要及时返回,甚至不需要返回值,但是如果充斥在主流程中,占用大量时间来处理,就可以通过异步的方式来优化。
实现异步的常用方法远不止两种,但是个人经验常用的,好用的,这里我就说两种,最好用的是第二种。
spring的注解方式@Async
org.springframework.scheduling.annotation.Async
jdk1.8后的CompletableFuture
java.util.concurrent.CompletableFuture
其中第一种的使用注意事项比较多
1.不要在本类中异步调用。即一个方法是异步方法,然后用另一个方法调用这个异步方法。
2.不要有返回值,使用void
3.不能使用本类的私有方法或者非接口化加注@Async,因为代理不到失效
4.异步方法不能使用static修饰
5.异步类需使用@Component注解,不然将导致spring无法扫描到异步类
6.SpringBoot框架必须在启动类中增加@EnableAsync注解
7.异步方法不要和事物注解同时存在。可以在事物的方法中调用另外一个类中的异步方法。在调用Async方法的方法上标注@Transactional是管理调用方法的事务的,在Async方法上标注@Transactional是管理异步方法的事务,事务因线程隔离
@Async的使用方式
1.pom引入依赖。只要依赖中存在spring-context包即可。
2.需要在springboot启动类上加上开启异步的注解@EnableAsync
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@EnableHystrix
@EnableFeignClients
@SpringBootApplication
public class OrderServerApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(OrderServerApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(OrderServerApplication.class, args);
}
}
3.可以专门封装一个异步类。然后那个方法需要用到异步的操作。在这个类中封装,然后在类中引入异步类即可。
在使用异步的地方引入调用即可。
CompletableFuture中的异步方法是在一个正常的方法体内使用即可。
private ExecutorService pool = Executors.newFixedThreadPool(2);
@Override
public void synOrder(String orderId, OrderSourceEnum type, Integer status) {
try {
CompletableFuture.runAsync(() -> {
//下面是一些业务操作。
PageVO pageVO = new PageVO();
Set<String> orderIds = new HashSet<>();
orderIds.add(orderId);
pageVO.setIds(orderIds);
pageVO.setOrderType(type);
List<MaisOrderDTO> maisOrderDTOS = orderSourceService.batchGetDetails(pageVO);
if (CollectionUtils.isEmpty(maisOrderDTOS)) {
throw new RuntimeException("未找到id=" + orderId + "类型为:" + type.getDesc() + "的订单");
}
}, pool);
} catch (Exception e) {
log.info("同步单个订单给群脉出现异常:{}", e);
}
}
参考博客:[Java并发-15] CompletableFuture: 异步编程
来源:https://blog.csdn.net/zhanglf02/article/details/103878108


猜你喜欢
- 最近由于参加一个小小的创意比赛,用安卓做了一个小小的图片识别应用,主要是通过拍照识别图片中的菜品,还有对象位置查找的东西。之前没有做过安卓,
- 这里是通过对回退键操作的阻断并重写实现:当按下回退键,弹出提示框选择是否退出,是则执行退出代码,否则什么都不做。在Mianactivity中
- 1、@Configuration&@Bean给容器中注册组件@Configuration及@Bean的使用参考如下代码:packag
- 本节作为主要讲解Spring Data的环境搭建JPA Spring Data :致力于减少数据访问层(DAO)的开发量。开发者唯一要做的就
- 一、简介当要将配置中心部署到生产环境中时,与服务注册中心一样,我们也希望它是一个高可用的应用。Spring Cloud Config实现服务
- Mybatis映射文件mapper.xml的注释问题从昨天夜晚9点到今天中午,一直被项目bug所困惑,中间这段时间一直未解决这个问题,也咨询
- 本文实例为大家分享了Android实现页面短信验证功能的具体代码,供大家参考,具体内容如下目标效果:上一篇博文介绍的是使用SDK中自带的验证
- Android有三个基础组件Activity,Service和BroadcastReceiver,他们都是依赖Intent来启动。本文介绍的
- 为了打造流畅的用户导航体验,我们不得不依赖智能手机最常见的一个功能:触摸。触摸改变应用程序的视图是现在最流行一种导航设计。在本文中,我们将经
- 在项目中如果涉及到用Excel开发的报表模版来导出报表数据的话,一般都是在Excel报表中使用VBA做成宏来进行调用。即先使用Excel自带
- C#单击菜单栏或工具栏时通过反射打开窗体的方法,可以以取代长长的if-else或switch-case语句。要点:将菜单或工具栏项的名称设置
- C#限速下载网络文件的方法,具体如下:using System;using System.Collections.Concurrent;us
- maven 打包 动态启动脚本介绍如何通过maven的环境变量动态打包, 并动态改变启动脚本中的环境参数之前都是每个环境一个启动脚本, 其实
- 要让项目实现 ssl 免密登录,首先需要开启 https 。所以先从 Spring Boot 如何开启 https 说起。创建服务端证书为了
- C# Linq延迟查询在定义linq查询表达式时,查询是不会执行,查询会在迭代数据项时运行。它使用yield return 语句返回谓词为t
- 目录I. 项目环境1. 项目依赖II. 缓存注解介绍1. @Cacheable2. @CachePut3. @CacheEvict4. @C
- 本文实例讲述了Java编程中文件读写的方法。分享给大家供大家参考,具体如下:Java中文件读写操作的作用是什么?回答这个问题时应该先想到的是
- 一、Flutter代码的启动起点我们在多数的业务场景下,使用的都是FlutterActivity、FlutterFragment。在在背后,
- java数据结构的堆什么是堆堆指的是使用数组保存完全二叉树结构,以层次遍历的方式放入数组中。如图:注意:堆方式适合于完全二叉树,对于非完全二
- 一、概述SPI(Service Provider Interface),是Java内置的一种服务提供发现机制,可以用来提高框架的扩展性,主要