0


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

前言

SpringBoot想必大家都用过,但是大家平时使用发布的接口大都是同步的,那么你知道如何优雅的实现异步呢?

这篇文章就是关于如何在

Spring Boot

中实现异步行为的。但首先,让我们看看同步和异步之间的区别。

  • 同步调用:- 调用者会阻塞,直到方法执行完成并返回结果。- 方法体的逻辑在调用线程中直接执行。
  • 异步编程: - 调用者会立即返回,而不会阻塞等待方法执行完成。- 方法体的逻辑会在其他线程中执行。- 通常会通过回调或Future模式来获取方法的执行结果。

1_result

下面介绍几种异步的方式:

1.@Async注解

​ 我们可以在方法上使用@Async注解,标识这是一个异步方法。然后Spring Boot会在独立的线程中执行这个方法。例如:

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

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

2.CompletableFuture

​ 我们可以通过CompletableFuture来异步化方法的调用,例如:

@Service
public class MyService {
    public CompletableFuture<String> doSomething() {
        return CompletableFuture.supplyAsync(() -> {
            // ...
            return "Result";
        });
    }
}

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

3.Reactor/RxJava

​ 如果我们的项目使用Reactor或RxJava,也可以很容易实现异步调用。例如:

@Service
public class MyService {
    public Flux<String> doSomething() {
        return Flux.defer(() -> {
            // ...
            return Flux.just("Result");
        });
    }
}

Flux可以表示异步数据流,我们在doSomething方法中返回Flux,表示这个方法的执行结果是一系列异步产生的数据。

4.WebFlux

如果是WebFlux webapp,可以直接通过其异步控制流来实现异步调用。例如:

@Controller
public class MyController {
    @GetMapping("/")
    public Mono<String> doSomething() {
        return Mono.defer(() -> {
            // ...
            return Mono.just("Result");
        });
    }
}

返回Mono表示这个请求的处理是异步的,会在其他线程中执行Controller方法逻辑。

总结

这些都是Spring Boot中实现异步调用的优雅方式。通过这些方式,我们可以很容易地在项目中加入异步逻辑,提高系统的响应性。

写在最后

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达!


本文转载自: https://blog.csdn.net/jinxinxin1314/article/details/130609130
版权归原作者 fking86 所有, 如有侵权,请联系我们删除。

“【SpringBoot系列】如何优雅地实现异步调用”的评论:

还没有评论