Spring @Async 与 Spring WebFlux

Posted

技术标签:

【中文标题】Spring @Async 与 Spring WebFlux【英文标题】:Spring @Async vs Spring WebFlux 【发布时间】:2021-02-19 16:21:41 【问题描述】:

我正在尝试使用 WebFlux 转换以下方法以避免在同一方法上使用 @Async。

@Async
@Override
public void notifyCallback(NotifyCallbackRequest request, String id) 

        startProcess(id);


控制器类:

@ResponseStatus(HttpStatus.OK)
@PostMapping("/notify-status/id")
public void notifyCallback(@PathVariable("id") String id, @RequestBody NotifyCallbackRequest request) 
    identityService.notifyCallback(request, id);

startProcess(id) 是一种通过 webflux 进行 api 调用并返回 Mono 类型的方法。 我感兴趣的是调用者会立即收到一个 ResponseStatus (HttpStatus.OK),尽管接下来会发生什么。

【问题讨论】:

【参考方案1】:

您可以独立于您的主反应链订阅您的“异步”任务,以便在调用端点后立即开始使其在后台运行。

@Override
public void notifyCallback(NotifyCallbackRequest request, String id) 
        startProcess(id).subscribe();


@ResponseStatus(HttpStatus.OK)
@PostMapping("/notify-status/id")
public Mono<Void> notifyCallback(@PathVariable("id") String id, @RequestBody NotifyCallbackRequest request) 
    identityService.notifyCallback(request, id);
    return Mono.empty();

您可以使用以下端点示例演示此行为。如果您调用端点,它将立即 200 和 10 秒后它会登录到您的控制台

@RequestMapping(path = "/async", method = RequestMethod.GET)
public Mono<Void> start() 
    Mono.delay(Duration.ofSeconds(10))
            .doOnNext(i -> LOGGER.info("we have waited 10 seconds"))
            .subscribe();

    return Mono.empty();
 

【讨论】:

以上是关于Spring @Async 与 Spring WebFlux的主要内容,如果未能解决你的问题,请参考以下文章

Spring @async原理

Spring Boot中异步线程池@Async详解

Spring中@Async注解实现“方法”的异步调用

Spring中@Async用法总结

Spring中@Async用法总结

Spring中的@Async