通常我们在某网站发送邮件验证码时,首先会提示验证码已发送,然而此时可能没有收到验证码,过几秒种才真正的收到。如果是同步会先验证发送是否成功然后再通知,如果是异步可以先通知用户已发送,并释放请求,然后再去异步处理。

@Async和@EnableAsync实现异步

控制层

    @GetMapping("/async")
public String async() throws InterruptedException {
myBatisService.task1();
myBatisService.task2();
System.out.print("释放请求");
return "ok";
}

服务层

    @Async
public void task1() throws InterruptedException {
Thread.sleep(2000L);
System.out.print("完成任务1");
} @Async
public void task2() throws InterruptedException {
Thread.sleep(2000L);
System.out.print("完成任务2");
}

同步:这是在一个控制层调用两个服务层的方法,任务1需要执行2秒时间,任务2又需要执行2秒时间,和普通方法的唯一区别就是异步方法上加了@Async

执行结果 显示输出完成任务1,然后是完成任务2,最后释放资源

如果要让@Async异步生效还需要在配置类中开启异步,

@EnableAsync
@SpringBootApplication
public class DemoApplication{
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}

再次执行,直接显示释放请求,然后是完成任务2和完成任务1 几乎是同时的。

这个异步实际上就是spring封装了一个基本的多线程功能,每个@Async都会开启一个新的线程,并且在内部使用了线程池。异步线程执行完以后并没有回调方法得知任务是否执行成功,在一般的web场景下,异步回调是在前端用ajax的方式来实现的,一个页面可以有多个ajax每个ajax去独立完成一个后台业务,谁先完成谁先响应,彼此互不干涉。后台业务则应该是彼此独立的以供ajax调用,如果在后台回调意味着多个业务任务整合到一个请求,而且这个请求的响应时间要按最慢那个任务计算。所以这种后台异步只适用于对请求结果实时性要求不高的场景,不建议在后台使用回调。

Spring Boot (18) @Async异步的更多相关文章

  1. Spring Boot -- Spring Boot之@Async异步调用、Mybatis、事务管理等

    这一节将在上一节的基础上,继续深入学习Spring Boot相关知识,其中主要包括@Async异步调用,@Value自定义参数.Mybatis.事务管理等. 本节所使用的代码是在上一节项目代码中,继续 ...

  2. spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)

    一,为什么要使用async异步线程池? 1,在生产环境中,有一些需要延时处理的业务场景: 例如:发送电子邮件, 给手机发短信验证码 大数据量的查询统计 远程抓取数据等 这些场景占用时间较长,而用户又没 ...

  3. spring boot使用@Async异步注解

    1.java的大部分接口的方法都是串行执行的,但是有些业务场景是不需要同步返回结果的,可以把结果直接返回,具体业务异步执行,也有些业务接口是需要并行获取数据,最后把数据聚合在统一返回给前端. 通常我们 ...

  4. spring boot(17)-@Async异步

    验证码的异步机制 上一篇讲过可以用邮件发验证码,通常我们在某网站发验证码时,首先会提示验证码已发送,请检查邮箱或者短信,这就是图中的1和3.然而此时查看邮箱或短信可能并没有收到验证码,往往要过几秒种才 ...

  5. Spring Boot使用@Async实现异步调用

    原文:http://blog.csdn.net/a286352250/article/details/53157822 项目GitHub地址 : https://github.com/FrameRes ...

  6. Spring Boot中实现异步调用之@Async

    一.什么是异步调用 “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用 的语句返回结果 ...

  7. 【Spring Boot学习之六】Spring Boot整合定时任务&异步调用

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2一.定时任务1.启动类添加注解@EnableScheduling 用于开启定时任务 package com.wjy; i ...

  8. (转)spring boot注解 --@EnableAsync 异步调用

    原文:http://www.cnblogs.com/azhqiang/p/5609615.html EnableAsync注解的意思是可以异步执行,就是开启多线程的意思.可以标注在方法.类上. @Co ...

  9. spring boot注解 --@EnableAsync 异步调用

    EnableAsync注解的意思是可以异步执行,就是开启多线程的意思.可以标注在方法.类上. @Component public class Task { @Async public void doT ...

随机推荐

  1. 零基础转行Linux云计算运维工程师获得20万年薪的超级学习技巧

    云计算概念一旦产生便一发不可收拾,成为移动互联网时代最为火热的行业之一.国内各大互联网公司例如阿里.腾讯.百度.网易等纷纷推出自己的云计算产品,3月10日,腾讯云0.01元投标时间更是让云计算在普罗大 ...

  2. hdu2013 蟠桃记【C++】

    蟠桃记 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  3. ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用

    zkclient是zookeeper的Java客户端.它让Zookeeper API 使用起来更简单:它非常方便订阅各种事件并自动重新绑定事件(会话建立.节点修改.节点删除.子节点变更等):它提供了s ...

  4. Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现

    Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现 Anoyi 精讲JAVA 精讲JAVA 微信号 toooooooozi 功能介绍 讲解java深层次 ...

  5. java 多线程面试题

    1.什么是线程? 线程是操作系统能够运行的最小调度单位,他被包含在进程中,是进程中实际运作的单位. 2.线程和进程的区别 线程是进程的子集,一个进程有很多线程,每个线程执行不同的任务,不同的进程使用不 ...

  6. 20180828Zabbix3使用percona-zabbix-templates监控MySQL

    引用网址: http://blog.chinaunix.net/uid-16844903-id-3535535.html http://www.ywnds.com/?p=6199 https://ww ...

  7. hive计算日期差

    首先,hive本身有一个UDF,名字是datediff.我们来看一下这个日期差计算的官方描述,(下面这个是怎么出来的): hive> desc function extended datedif ...

  8. 【ACM】nyoj_106_背包问题_201308152026

    背包问题时间限制:3000 ms  |  内存限制:65535 KB 难度:3描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10 ...

  9. eclipse上导入import git项目

    1.左上角File->import->git eclipse 可以从很多来源处import项目,项目来源可以使git/maven/general等. import来源可以看下面 2.点击g ...

  10. SVN:通过命令行只提交目录,并忽略其中的文件

    通过SVN命令行,我们可以只提交项目的目录结构,从而绕开一开始就将我们不想要上传的文件给提交到服务器上.命令如下:svn add -N [directory] 之后可以进入此目录,执行以下命令:svn ...