前言

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

这篇文章就是关于如何在Spring Boot中实现异步行为的。但首先,让我们看看同步和异步之间的区别。

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

spring boot中Scheduled 如何异步执行 spring boot方法异步执行_后端

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

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中实现异步调用的优雅方式。通过这些方式,我们可以很容易地在项目中加入异步逻辑,提高系统的响应性。