欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-20 12:39:44
一般对于业务复杂的流程,会有一些处理逻辑不需要及时返回,甚至不需要返回值,但是如果充斥在主流程中,占用大量时间来处理,就可以通过异步的方式来优化。 实现异步的常用方法远不止两种,...

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

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

  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包即可。

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

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.可以专门封装一个异步类。然后那个方法需要用到异步的操作。在这个类中封装,然后在类中引入异步类即可

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

在使用异步的地方引入调用即可。

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

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: 异步编程

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