本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-29 目录。

原创不易,给点个 Star 嘿,一起冲鸭!

1. 概述

在日常开发中,我们的逻辑都是同步调用,顺序执行。在一些场景下,我们会希望异步调用,将和主线程关联度低的逻辑异步调用,以实现让主线程更快的执行完成,提升性能。例如说:记录用户访问日志到数据库,记录管理员操作日志到数据库中。

异步调用,对应的是同步调用。

  • 同步调用:指程序按照 定义顺序 依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;

  • 异步调用:指程序在顺序执行时,不等待异步调用的语句返回结果,就执行后面的程序。

考虑到异步调用的可靠性,我们一般会考虑引入分布式消息队列,例如说 RabbitMQ、RocketMQ、Kafka 等等。但是在一些时候,我们并不需要这么高的可靠性,可以使用进程内的队列或者线程池。例如说示例代码如下:

public class Demo {public static void main(String[] args) {// 创建线程池。这里只是临时测试,不要扣艿艿遵守阿里 Java 开发规范,YEAHExecutorService executor = Executors.newFixedThreadPool(10);// 提交任务到线程池中执行。executor.submit(new Runnable() {@Overridepublic void run() {System.out.println("听说我被异步调用了");}});}}

友情提示:这里说进程内的队列或者线程池,相对不可靠的原因是,队列和线程池中的任务仅仅存储在内存中,如果 JVM 进程被异常关闭,将会导致丢失,未被执行。

而分布式消息队列,异步调用会以一个消息的形式,存储在消息队列的服务器上,所以即使 JVM 进程被异常关闭,消息依然在消息队列的服务器上。

所以,使用进程内的队列或者线程池来实现异步调用的话,一定要尽可能的保证 JVM 进程的优雅关闭,保证它们在关闭前被执行完成。

在 Spring Framework 的 Spring Task 模块,提供了 @Async 注解,可以添加在方法上,自动实现该方法的异步调用。

Spring 异步调用,一行代码实现!舒服,不接受任何反驳~相关推荐

  1. Spring异步调用原理及SpringAop拦截器链原理

    一.Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTI ...

  2. Spring异步调用传递Request对象问题分析

    一.问题描述 近期在实验室做了个动态插桩工具,在对甲方项目测试过程中,发现对含有线程池异步调用的方法进行插桩时,子线程会报空指针异常. 二.问题原因 动态插桩工具向待测软件注入的代码中包含了如下语句, ...

  3. odciexttableopen 调用出错 error open log_如何在 Spring 异步调用中传递上下文

    什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行.异步调用指,在程序在执行时,无 ...

  4. delphi 异步 调用 带参数_如何在 Spring 异步调用中传递上下文

    什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行.异步调用指,在程序在执行时,无 ...

  5. Spring Boot 中一行代码搞定Http请求!

    在Java的世界中,Http客户端之前一直是Apache家的HttpClient占据主导,但是由于此包较为庞大,API又比较难用,因此并不使用很多场景.而新兴的OkHttp.Jodd-http固然好用 ...

  6. 使用CompletableFuture实现业务服务的异步调用实战代码

    假如我有一个订单相关的统计接口,需要返回3样数据:今日订单数.今日交易额.总交易额. 一般的我们的做法是串行调用3个函数,把调用返回的结果返回给调用者,这3次调用时串行执行的,如果每个调用耗时1秒的话 ...

  7. 基于飞桨PaddlePaddle实现素描线稿提取——仅需一行代码即可实现模型调用

    一行代码实现从彩色图提取素描线稿 一.前言:初识PaddleHub 预训练模型(Pre-Trained Models) 二.构建Module的大框架 1.将模型文件存放在infer_model下 2. ...

  8. 使用xmlhttp结合asp,实现网页的异步调用_asp实例

    通过xmlHttp和ASP的结合,我们可以轻松完成网页的异步调用. 代码如下: 1.新建Display.asp(这是前台显示页面) 注意xmlhttp.readyState的4个属性 1:LOADIN ...

  9. java thrift异步调用_thrift异步调用 - thrift-cob_style-tnonblockingserver - ItBoth

    [ thrift 在python中使用了 tornado和  twisted 来作为异步的webserive服务提供异步接口,自身并没有实现     twisted:         Generate ...

最新文章

  1. 墨瞳漫画h5一期 vuejs总结
  2. mybatis批量更新报错XXXXX-Inline
  3. python词云代码简单_Python 简单实现标签词云
  4. Exchange2013恢复已删除用户邮箱
  5. san分布式共享文件系统_基于SAN存储共享卷实现openstack高可用的方法与流程
  6. Component 初识组件
  7. Julia :复合类型struct当索引时
  8. 干货|一文看懂BLE低功耗技术-附主流BLE芯片厂商介绍
  9. 第三部份:glibc升级到glibc-2.30
  10. 拓扑排序算法分析(通俗易懂)
  11. Rufus v3.6 最好用的创建USB启动盘,速度嗖嗖的
  12. SFR算法详解(三)——浅析关于SFR的一些物理意义及原理
  13. 浏览器主页被更改成7654主页
  14. 天眼查企业工商信息查询接口
  15. Error installing to Instantiated: name=AttachmentStore state=Described
  16. 关于我转行嵌入式的那些事
  17. linux桌面添加第三方软件图标
  18. 知识图谱与推荐系统综述
  19. Python财务分析-Pandas复制Google Trends
  20. LinkCloud谈云主机与主机托管主机租用的区别

热门文章

  1. 《云计算》学习笔记4——Google的云计算原理与应用(分布式结构化数据表BigTable)
  2. 安装完CentOS可以不做的事
  3. [转载]Office Visio快捷键
  4. Hitpoint:外贸企业如何选择合适的ERP系统
  5. 安卓开发日记(1) - 安装 Android 开发环境和 first app
  6. [置顶] HTML5 实现小车动画效果(Canvas/CSS3/JQuery)
  7. ubuntu下安装极点五笔
  8. Java-JSTL(JSP标准标签库)
  9. 基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结
  10. C/C++存储区划分