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的主要内容,如果未能解决你的问题,请参考以下文章