详解springboot中使用异步的常用两种方式及其比较

 更新时间:2020年01月09日 14:10:19   作者:万米高空  
这篇文章主要介绍了详解springboot中使用异步的常用两种方式及其比较,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一般对于业务复杂的流程,会有一些处理逻辑不需要及时返回,甚至不需要返回值,但是如果充斥在主流程中,占用大量时间来处理,就可以通过异步的方式来优化。

实现异步的常用方法远不止两种,但是个人经验常用的,好用的,这里我就说两种,最好用的是第二种。

  1. spring的注解方式@Async org.springframework.scheduling.annotation.Async
  2. 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: 异步编程

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java 实战范例之精美网上音乐平台的实现

    Java 实战范例之精美网上音乐平台的实现

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+vue+Springboot+ssm+mysql+maven+redis实现一个前后端分离的精美网上音乐平台,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • 零基础入门SpringMVC拦截器的配置与使用

    零基础入门SpringMVC拦截器的配置与使用

    Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。本文将代码演示和文字描述详解拦截器的原理与使用
    2022-04-04
  • Java实现批量下载文件的示例代码

    Java实现批量下载文件的示例代码

    这篇文章主要为大家详细介绍了Java如何实现批量下载文件,并以压缩输出流的形式返回前端,文中的示例代码讲解详细,需要的小伙伴可以参考一下
    2023-10-10
  • eclipse创建多层包(多级包)全过程

    eclipse创建多层包(多级包)全过程

    这篇文章主要介绍了eclipse创建多层包(多级包)全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Springboot整合Shiro之加盐MD5加密的方法

    Springboot整合Shiro之加盐MD5加密的方法

    这篇文章主要介绍了Springboot整合Shiro之加盐MD5加密的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • IDEA中已配置阿里镜像但maven无法下载jar包的问题及解决方法

    IDEA中已配置阿里镜像但maven无法下载jar包的问题及解决方法

    这篇文章主要介绍了IDEA中已配置阿里镜像但maven无法下载jar包的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 浅谈java对象转json,数字精确出现丢失问题

    浅谈java对象转json,数字精确出现丢失问题

    下面小编就为大家带来一篇浅谈java对象转json, 数字精确出现丢失问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java 程序员必备的 Intellij IDEA 插件

    Java 程序员必备的 Intellij IDEA 插件

    java插件十分方便实用,以下是我用过不错的Intellij插件,当然还有很多插件也都不错,下面将我觉得不错的插件分享给大家,希望能帮到大家
    2018-09-09
  • java无锁hashmap原理与实现详解

    java无锁hashmap原理与实现详解

    本文主要介绍了java无锁hashmap原理与实现,大家参考使用吧
    2014-01-01
  • 详解Java使用双异步后如何保证数据一致性

    详解Java使用双异步后如何保证数据一致性

    这篇文章主要为大家详细介绍了Java使用双异步后如何保证数据一致性,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下
    2024-01-01

最新评论