介绍

所谓的异步执行其实就是使用多线程的方式实现异步调用。

异步有什么好处呢?

如果一个业务逻辑执行完成需要多个步骤,也就是调用多个方法去执行,

这个时候异步执行比同步执行相应更快。不过要注意异步请求的顺序和处理结果的顺序最好一致,不然就达不到效果了。

启用异步

需要在应用入口类上添加:@EnableAsync

@EnableAsync
@SpringBootApplication
@IntegrationComponentScan("com.ztjy")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}

定义一个线程池

@Configuration
public class AsyncTaskPoolConfig { @Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(200);
executor.setQueueCapacity(50);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("taskExecutor-ws-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}

编写异步请求

在异步执行的方法上添加注解:@Async

Component
@Log4j2
public class AsyncTask { //这里注入的是dubbo的服务,和异步请求没有多大关系
@Reference(check = false)
private AuthorFacade authorFacade; /**
* 获取作者信息
*
* @param authorId 作者ID
* @return 作者信息
*/
@Async
public Future<AuthorDTO> getAuthor(String authorId){
try {
System.out.println("执行线程的名字:"+Thread.currentThread().getName());
return new AsyncResult<AuthorDTO>(authorFacade.getAuthor(authorId));
} catch (Exception e) {
e.printStackTrace();
return null;
}
} }

在service里调用异步执行的方法

/**
* 异步调用获取文章信息
*
* @param articleId 文章ID
* @return 文章信息
*/
@Override
public Map getArticleDetailAsync(String articleId){
//同步调用获取文章信息
ArticleDTO articleDTO = articleFacade.getArticle(articleId);
//异步调用获取作者信息
Future<AuthorDTO> authorFuture = asyncTask.getAuthor(articleDTO.getAuthorId()); Map<String,Object> map=new HashMap<>(10);
map.put("article",articleDTO);
try{
map.put("author",authorFuture.get());
}catch (Exception e){
log.error(e.getMessage());
}
return map;
}

注意

如果出现循环了依赖的问题:

https://www.qingtingip.com/h_309979.html

尽量不要在本类中异步调用

尽量不要有返回值

不能使用本类的私有方法或者非接口化加注@Async,因为代理不到失效

异步方法不能使用static修饰

异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类

类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象

如果使用SpringBoot框架必须在启动类中增加@EnableAsync注解

在调用Async方法的方法上标注@Transactional是管理调用方法的事务的

在Async方法上标注@Transactional是管理异步方法的事务,事务因线程隔离

使用过程中可能遇到循环依赖或者异步失效,事务的问题,可以参考:

作者:锦成同学

链接:https://juejin.im/post/5d47a80a6fb9a06ad3470f9a

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

springboot实现异步调用的更多相关文章

  1. springboot之异步调用@Async

    原文:http://www.cnblogs.com/xuwenjin/p/8858050.html 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交 ...

  2. springboot:异步调用@Async

    在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...

  3. SpringBoot的异步调用介绍

    参考博客: https://www.cnblogs.com/jebysun/p/9675345.html https://blog.csdn.net/weixin_38399962/article/d ...

  4. springboot的异步调用

    package com.handsight.platform.fras.aapp; import java.util.Locale; import org.slf4j.Logger; import o ...

  5. SpringBoot中异步请求和异步调用(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...

  6. spring boot实现异步调用

    今天在这里学习下使用springboot的异步调用async 首先使用@EnableAsync开启异步功能 /** * @author fengzp * @date 17/5/8 * @email f ...

  7. springBoot中实现自定义属性配置、实现异步调用、多环境配置

    springBoot中其他相关: 1:springBoot中自定义参数: 1-1.自定义属性配置: 在application.properties中除了可以修改默认配置,我们还可以在这配置自定义的属性 ...

  8. springboot 异步调用Async使用方法

    引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...

  9. SpringBoot | 第二十一章:异步开发之异步调用

    前言 上一章节,我们知道了如何进行异步请求的处理.除了异步请求,一般上我们用的比较多的应该是异步调用.通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的.比如记录日志信息等业务.这个时候 ...

随机推荐

  1. java封装数据类型——Integer 缓存策略验证

    上一篇学习 Integer 类型源码,知道了它使用缓存策略,默认对 [-128, 127] 范围的对象进行类加载时自动创建缓存. Integer 源码学习:https://www.cnblogs.co ...

  2. 3、java基础:抽象类与接口的区别

    抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...

  3. vue跳转本页面报错

    一个按钮绑定一个方法,方法是跳转到某个路由地址,当已经点击触发方法到该路由下的时候,再进行点击该按钮控制台就会报错,不会影响项目运行 解决方法: if(this.$route.path == '/bi ...

  4. 转载一篇有关于diff的文章,方便以后复习

    本文章是转载的,为了方便以后复习,特地记录一下.他人请去原地址观看!!! 文章原地址:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.h ...

  5. AngularJS入门教程之数据绑定原理详解

    这篇文章主要是写给新手的,是给那些刚刚开始接触Angular,并且想了解数据帮定是如何工作的人.如果你已经对Angular比较了解了,那强烈建议你直接去阅读源代码. Angular用户都想知道数据绑定 ...

  6. stm32 窗口看门狗 WWDG

    窗口看门狗WWDG其实和独立看门狗类似,它是一个7位递减计数器不断的往下递减计数,当减到一个固定值0x40时还不喂狗的话,产生一个MCU复位,这个值叫窗口的下限,是固定的值,不能改变 窗口看门狗(WW ...

  7. 如何用HAProxy+Nginx实现负载均衡

    一.什么是HAProxy HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点, ...

  8. springboot学习链接

    https://github.com/wuyouzhuguli/SpringAll

  9. git切换账号邮箱

    git config user.name 查看当前用户名 git config user.email 查看当前邮箱 git config --global user.name "用户名&qu ...

  10. java_数据类型转换

    一.自动转换 目的类型比原来的类型要大,两种数据类型是相互兼容的. byte--->short short--->int char--->int int--->long/dou ...