热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

SpringBoot用@Async注解实现异步任务

这篇文章主要介绍了SpringBoot用@Async注解实现异步任务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

什么是异步调用?

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

如何实现异步调用?

多线程,这是很多人第一眼想到的关键词,没错,多线程就是一种实现异步调用的方式。

在非spring目项目中我们要实现异步调用的就是使用多线程方式,可以自己实现Runable接口或者集成Thread类,或者使用jdk1.5以上提供了的Executors线程池。

StrngBoot中则提供了很方便的方式执行异步调用。

异步接口的使用场景

耗时比较长,任务比较多的接口。比方说,文件下载,大文件下载比较耗时,这个时候就可以使用异步接口。

项目示例已上传至GitHub,可见github项目地址。

   在解释异步调用之前,我们先来看同步调用的定义;同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。

   例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕; 如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了。

@Async介绍

基于@Async标注的方法称为异步方法,方法在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。使用时在SpringBoot主配置类中开启异步即可。

@EnableAsync
@SpringBootApplication
public class SpringBootAsyncTestApplication {

无返回值异步方法

@Async
public void asyncMethodWithNoReturnType() {
  try {
    Thread.sleep(3000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  System.out.println("asyncMethodWithNoReturnType...");
}

使用方法比较简单,编写一个测试方法并加上@Async注解即可。

含返回值异步方法

@Async
public Future asyncMethodWithReturnType() {
  try {
  		Thread.sleep(3000);
  		return new AsyncResult("success");
  } catch (InterruptedException e) {
  		e.printStackTrace();
  }
  System.out.println("asyncMethodWithReturnType...");
  return null;
}

返回值利用Future泛型接口实现。

Future是对于具体的 Runnable 或者 Callable 任务的执行结果进行取消、查询是否完成、获取结果的接口,必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果,包含了以下几个方法。

public interface Future {
  boolean cancel(boolean mayInterruptIfRunning);
  
  boolean isCancelled();
  
  boolean isDone();

  V get() throws InterruptedException, ExecutionException;
  
  V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}

1.cancel方法的作用是取消任务,取消任务成功则返回true,反之返回false。参数 mayInterruptIfRunning 表示是否允许取消正在执行却没有执行完毕的任务。

运行cancel方法取消任务时:

i.若任务已完成:则无论 mayInterruptIfRunning 为 true 或 false,此方法都返回 false,即取消已经完成的任务都会返回false。

i.若任务正在执行:

  •  mayInterruptIfRunning 设置为 true,则返回true。
  • mayInterruptIfRunning 设置为false,则返回false。

iii.如果任务未执行,则无论mayInterruptIfRunning为true还是false,都返回true。

2.isCancelled方法的作用是判断任务是否被取消成功,若在任务正常完成前被取消,则返回 true。

3.isDone方法的作用是判断任务是否已经完成,若任务已完成,则返回true。

4.get()方法的作用是获取执行结果,注意此方法会产生阻塞,等到任务执行完毕后才能获得执行结果。

5.get(long timeout, TimeUnit unit)方法的作用同样是获取执行结果,若在指定时间内还未获取到执行结果,则返回null。

编写测试接口

编写/callWithNoReturnType和/callWithReturnType接口用于查看异步任务的执行过程。

@RestController
public class AsyncController {
  @Autowired
  AsyncService asynSerivce;

  @GetMapping("/callWithNoReturnType")
  public String callWithNoReturnType() {
    asynSerivce.asyncMethodWithNoReturnType();
    return "success";
  }

  @GetMapping("/callWithReturnType")
  public String callWithReturnType() {
    Future future=asynSerivce.asyncMethodWithReturnType();
    try {
      return future.get();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (ExecutionException e) {
      e.printStackTrace();
    }
    return "fail";
  }

运行项目后使用Postman进行接口测试,分别给/callWithNoReturnType和/callWithReturnType接口发送Get请求,调用无返回值的异步方法asyncWithNoReturnType时,会立即返回返回值。但调用含返回值异步方法asyncWithReturnType时,由于我们调用了get()方法,会在等待3000毫秒后,才返回返回值。

到此这篇关于SpringBoot用@Async注解实现异步任务的文章就介绍到这了,更多相关SpringBoot @Async异步内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文介绍了多种常用的开发工具,包括PyCharm、Appium、Jenkins、Postman、Fiddler、Charles、Airtest、Android Studio、Navicat和Typora,并提供了它们的基本使用方法。 ... [详细]
  • 本文旨在介绍一系列提升工作效率的浏览器插件和实用小工具,帮助用户在日常工作中更加便捷高效。内容由原作者授权发布。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 在使用Postman进行接口测试时,如果携带大量参数,可能会遇到‘请求头过大’的问题。本文将详细介绍如何调整Tomcat的请求头大小限制,并提供有效的路径映射解决方案,以避免因路径配置不当导致的404错误。 ... [详细]
  • HTTP中的Chunked编码与Content-Length的区别及应用场景
    本文探讨了在HTTP协议中,当使用Transfer-Encoding为chunked时为何无需设置Content-Length,以及这种编码方式的具体实现和优势。 ... [详细]
  • 本文探讨了如何在Sitecore 9环境中通过Postman使用API密钥发送请求,包括解决常见错误的方法。 ... [详细]
  • 本文详细介绍了如何在 Postman 中配置和发送带有 Cookie 的请求,包括不同版本的 Postman 如何处理 Cookie,以及如何启用拦截器来管理 Cookie。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 如何将PostMan接口脚本快速集成至JMeter进行压力测试
    本文详细介绍了如何将PostMan中的接口脚本快速迁移至JMeter中,以实现高效的压力测试。适合希望利用现有PostMan资源进行性能测试的技术人员。 ... [详细]
  • 本文介绍了如何使用Postman构建和发送HTTP请求,包括四个主要部分:方法(Method)、URL、头部(Headers)和主体(Body)。特别强调了Body部分的重要性,并详细说明了不同类型的请求体。 ... [详细]
  • 20款必备PS插件免费大放送,附详细安装指南
    对于众多关注小资源并学习PS的用户来说,每次分享设计素材都会收到大量反馈。为了更好地满足大家的需求,今天我们特别推出了20款必备的PS插件大合集,并附有详细的安装指南,确保每位用户都能轻松上手,提升设计效率。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 深入解析Postman内置变量的实用技巧与示例代码
    本文详细探讨了Postman内置变量的实用技巧和应用案例,通过具体的示例代码,全面解析了这些变量在实际开发和测试中的使用方法,为读者提供了宝贵的学习和参考资源。 ... [详细]
  • 本文深入探讨了在Spring Boot中处理RESTful风格的表单请求的方法,包括请求参数处理、请求映射以及RESTful设计原则的应用。文章详细介绍了如何利用HTTP动词(如GET、POST、PUT、DELETE)来操作资源,并结合Spring Boot的注解(如@GetMapping、@PostMapping等)实现高效、清晰的请求处理逻辑。通过实例分析,展示了如何在实际项目中应用这些技术,提高开发效率和代码可维护性。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
author-avatar
思恋相依相惜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有