【SpringBoot系列】如何优雅地实现异步调用

这篇具有很好参考价值的文章主要介绍了【SpringBoot系列】如何优雅地实现异步调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【SpringBoot系列】如何优雅地实现异步调用

1.前言

在现代的应用程序开发中,异步调用是提高系统性能和响应能力的重要手段之一。

Spring Boot作为一个快速开发框架,提供了多种方式来实现异步调用,使得开发者能够更加优雅地处理并发和异步任务。

本文将介绍如何在Spring Boot中实现异步调用的方法和技巧,帮助开发者更好地利用异步调用提升系统的性能和可扩展性。


2.同步和异步之间的区别

【SpringBoot系列】如何优雅地实现异步调用

2.1 执行方式

同步是指程序按照顺序依次执行,每个操作完成后再执行下一个操作;

异步是指程序不按照顺序执行,可以同时执行多个操作。

2.2 阻塞与非阻塞

同步操作是阻塞的,即在执行某个操作时,程序会一直等待该操作完成后才能继续执行下一个操作;

异步操作是非阻塞的,即在执行某个操作时,程序可以继续执行其他操作,不需要等待该操作完成。

2.3 返回结果

同步操作会立即返回结果,程序可以直接使用该结果进行后续处理;

异步操作不会立即返回结果,而是通过回调函数、轮询或者事件通知等方式来获取结果。

2.4 资源利用率

同步操作会占用线程资源,每个操作都需要一个线程来执行

异步操作可以充分利用线程资源,一个线程可以同时处理多个操作。

2.5 编程模型

同步操作的编程模型相对简单,代码易于理解和调试;

异步操作的编程模型相对复杂,需要处理回调函数、事件监听等机制。

【SpringBoot系列】如何优雅地实现异步调用


3.几种异步的方式

【SpringBoot系列】如何优雅地实现异步调用

3.1 @Async注解

@Async注解是Spring框架提供的一个注解,用于标识一个方法是异步执行的。

当一个方法被@Async注解修饰后,该方法的执行将会在一个单独的线程中进行,而不会阻塞当前线程。

使用@Async注解需要满足以下条件:

1.在Spring配置文件中开启异步支持,可以通过在配置类上添加@EnableAsync注解或者在配置文件中配置task:annotation-driven/来实现。
2.在需要异步执行的方法上添加@Async注解。

示例
@Service
public class MyService {
    @Async
    public void doSomething() {
        // ...
    }
}

调用doSomething()方法时,会在新的线程中执行,实现异步。

需要注意的是,使用@Async注解时,被注解的方法不能是private或final的,因为Spring需要通过代理来实现异步执行。另外,被注解的方法不能在同一个类中被调用,否则异步执行将失效,因为Spring无法通过代理来实现异步调用。

3.2 CompletableFuture

​ CompletableFuture是Java 8中引入的一个类,用于支持异步编程和处理异步任务的结果。它提供了一种简洁而强大的方式来处理异步操作,可以方便地进行任务的组合、转换和处理

3.2.1 特点

异步执行

CompletableFuture可以通过supplyAsync()或runAsync()方法来异步执行任务,返回一个CompletableFuture对象。

链式操作

CompletableFuture提供了一系列的方法,如thenApply()、thenAccept()、thenRun()等,可以对异步任务的结果进行处理,形成链式操作。

异常处理

CompletableFuture提供了exceptionally()和handle()方法,用于处理异步任务中的异常情况。

组合操作

CompletableFuture提供了一系列的组合方法,如thenCompose()、thenCombine()、allOf()、anyOf()等,可以方便地组合多个异步任务。

等待结果

CompletableFuture提供了一系列的方法,如get()、join()、getNow()等,可以等待异步任务的结果。

3.2.2 示例
import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {

public static void main(String[] args) {
// 异步执行任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 异步任务的逻辑
return "Hello, CompletableFuture!";
});

// 处理异步任务的结果
future.thenAccept(result -> {
System.out.println(result);
});

// 等待异步任务的结果
future.join();
}
}

调用该方法会立即返回一个CompletableFuture,在其他线程中异步执行方法逻辑,最终设置结果。

需要注意的是,CompletableFuture类是线程安全的,可以在多线程环境下使用。

另外,CompletableFuture还提供了一些其他的方法,如whenComplete()、thenCompose()、thenCombine()等,可以根据具体需求选择合适的方法来处理异步任务。

3.3 Reactor/RxJava

​ Reactor和RxJava都是用于支持响应式编程的库,它们提供了一种基于事件流的编程模型,可以方便地处理异步和并发操作。

3.3.1 Reactor示例
import reactor.core.publisher.Flux;

public class ReactorExample {

    public static void main(String[] args) {
        // 创建一个包含1到5的异步序列
        Flux<Integer> flux = Flux.range(1, 5);

        // 订阅序列并处理元素
        flux.subscribe(System.out::println);
    }
}
3.3.2 RxJava示例
import io.reactivex.Observable;

public class RxJavaExample {

    public static void main(String[] args) {
        // 创建一个包含1到5的异步序列
        Observable<Integer> observable = Observable.range(1, 5);

        // 订阅序列并处理元素
        observable.subscribe(System.out::println);
    }
}

需要注意的是,Reactor和RxJava都提供了丰富的操作符和工具,可以进行过滤、转换、组合等操作,以及处理错误和异常情况。可以根据具体需求选择合适的操作符和方法来处理异步和并发操作。

3.4 WebFlux

WebFlux是Spring Framework 5引入的一种响应式编程模型,用于构建高性能、可扩展的Web应用程序。它基于Reactor库,提供了一种非阻塞的、异步的编程方式,可以处理大量并发请求,同时保持低的资源消耗。

WebFlux的核心是基于事件驱动的编程模型,通过使用异步非阻塞的方式处理请求和响应,可以充分利用服务器资源,提高系统的吞吐量和响应速度。它支持多种编程模型,包括函数式编程和反应式流编程,可以根据实际需求选择合适的方式进行开发。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@SpringBootApplication
public class WebFluxExampleApplication {

	public static void main(String[] args) {
		SpringApplication.run(WebFluxExampleApplication.class, args);
	}
}

@RestController
class HelloController {
    @GetMapping("/hello")
    public Mono<String> hello() {
    	return Mono.just("Hello, WebFlux!");
    }
}

总结

通过本文的介绍,我们了解了在Spring Boot中实现异步调用的多种方式和技巧。

无论是使用@Async注解实现异步方法,还是使用CompletableFuture来处理异步任务,亦或是使用消息队列来实现异步消息处理,Spring Boot都提供了丰富的工具和框架来支持异步调用。

通过合理地运用这些技术,我们可以优雅地处理并发和异步任务,提升系统的性能和可扩展性。


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,系统架构, 分布式, java, GO, python, 游戏相关 等系列文章,一系列干货随时送达!

【SpringBoot系列】如何优雅地实现异步调用文章来源地址https://www.toymoban.com/news/detail-465810.html

到了这里,关于【SpringBoot系列】如何优雅地实现异步调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot实现异步调用的几种方式

    一、使用 CompletableFuture 实现异步任务 CompletableFuture 是 Java 8 新增的一个异步编程工具,它可以方便地实现异步任务。使用 CompletableFuture 需要满足以下条件: 异步任务的返回值类型必须是 CompletableFuture 类型; 在异步任务中使用 CompletableFuture.supplyAsync() 或 CompletableFuture.runAsy

    2024年02月08日
    浏览(35)
  • 如何在不依赖于Mq的形式下更优雅地实现异步任务处理!!!

    考虑到现有业务很多依赖于 MQ的方式进行,这种方式需要依赖于MQ,发送消息到mq和消费mq消息时需要了解mq消息结构进行相应处理; 对于后续对同样的事件做其他处理的人如不能提前了解到已有相应消息发到了mq就得再发一次消息到mq等。 图1.1 消息中间件 现需要考虑在不依赖

    2024年02月19日
    浏览(25)
  • 互联网大厂技术-HTTP请求-Springboot整合Feign更优雅地实现Http服务调用

    目录 一、SpringBoot快速整合Feign 1.添加Pom依赖 2.启动类添加注解 3.引用Feign服务 二、为请求添加Header的3种方式 1.添加固定header 2.通过接口签名添加header 3.动态添加header 三、为请求添加超时配置 1.默认超时时间 3.超时异常 4.全局超时配置 5.为单个服务设置超时配置 四、为请求配

    2024年02月04日
    浏览(46)
  • java 如何快速实现异步调用方法

    在实现异步调用之前,我们先了解一下,什么是异步编程?什么场景下适用等等情况。 我们都知道,在传统的同步编程中,当一个操作开始执行时, 程序会阻塞并等待该操作完成,然后才能继续执行后续代码 。这种阻塞等待的方式可能会导致程序响应性能下降,因为在等待

    2024年02月15日
    浏览(29)
  • SpringBoot项目如何优雅的实现操作日志记录

    在实际开发当中,对于某些关键业务,我们通常需要记录该操作的内容,一个操作调一次记录方法,每次还得去收集参数等等,会造成大量代码重复。 我们希望代码中只有业务相关的操作,在项目中使用注解来完成此项功能。 通常就是使用Spring中的AOP特性来实现的,那么在

    2024年01月18日
    浏览(37)
  • SpringBoot如何优雅的实现重试功能

    在有些特定场景,如和第三方对接。 我们调用接口时需要支持重试功能,第一次调用没成功,我们需要等待x秒后再次调用。 通常会设置重试次数,避免业务。 一般我们会这样写 这样写本身,没什么问题。 但是如果多个接口都需要重试的话,代码就不优雅了。 spring系列的

    2024年02月08日
    浏览(31)
  • 并发编程 | CompletionService - 如何优雅地处理批量异步任务

    上一篇文章中,我们详细地介绍了 CompletableFuture,它是一种强大的并发工具,能帮助我们以声明式的方式处理异步任务。虽然 CompletableFuture 很强大,但它并不总是最适合所有场景的解决方案。 在这篇文章中,我们将介绍 Java 的 CompletionService,这是一种能处理 批量异步任务

    2024年02月15日
    浏览(32)
  • 互联网大厂技术-HTTP请求-Springboot整合Feign更优雅地实现Http服务调用 no suitable HttpMessageConverter found for response type

    目录 一、SpringBoot快速整合Feign 1.添加Pom依赖 2.启动类添加注解 3.引用Feign服务 二、为请求添加Header的3种方式 1.添加固定header 2.通过接口签名添加header 3.动态添加header 三、为请求添加超时配置 1.默认超时时间 3.超时异常 4.全局超时配置 5.为单个服务设置超时配置 四、为请求配

    2024年02月11日
    浏览(44)
  • 【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合!

    🎉🎉 欢迎光临,终于等到你啦 🎉🎉 🏅我是 苏泽 ,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 《Spring 狂野之旅:从入门到入魔》 🚀 本专栏带你从Spring入门到入魔   这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.

    2024年03月10日
    浏览(39)
  • springboot @Async 异步调用接口处理数据

    @Async 异步背景 新增的数据需要分发给下游业务系统,由于下游业务系统状态未知,所以需要异步发送数据给下游业务系统。 系统生效按钮---controller新增--异步调用servcie---数据集成 在springboot框架中实现步骤 首先在启动类上加上 @EnableAsync 注解开启项目的异步调用功能,其次

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包