webflux 中的异步请求不是异步的
Async requests in webflux are not async
我希望我的请求触发一些长 运行 操作,该操作应在后台执行。
我编写了以下应该在后台处理我的操作的实现,但实际上我的请求是同步执行的:
@AsyncTimeout(10 * 60 * 1000)
@PostMapping("/dosomething")
Mono<Void> doSomething() {
return Mono.defer(() -> delay()).subscribeOn(Schedulers.elastic());
}
public static Mono<Void> delay() {
return Mono.fromRunnable(() -> {
LOG.info("Started sleep");
Uninterruptibles.sleepUninterruptibly(10, TimeUnit.SECONDS);
LOG.info("Finished sleep");
});
}
我在日志中看到以下内容:
14:29:58.801 DEBUG 1 --- [p1491676195-768] Incoming request for POST http://localhost:8989/dosomething
14:29:58.802 INFO 1 --- [ elastic-6] Started sleep
14:30:08.803 INFO 1 --- [ elastic-6] Finished sleep
14:30:08.806 DEBUG 1 --- [p1491676195-655] Outgoing response for POST http://localhost:8989/dosomething: 200
我看到我的 sleep
在另一个线程中执行,但由于某种原因,我的原始请求等待睡眠完成
更新 1:
@PostMapping("/dosomething")
Mono<Void> doSomething() {
return Mono.defer(() -> {
delay().subscribe();
return Mono.empty();
});
根据我读过的评论以及我对您的担忧的理解,如果您希望 运行 阻塞调用但 运行 它在后台立即返回响应服务调用,您可以简单地将 subscribeOn
添加到该进程,在您的示例中是 delay()
。这将使它 运行 在不同的线程中:
@PostMapping("/dosomething")
Mono<Void> doSomething() {
return Mono.defer(() -> {
delay().subscribeOn(Schedulers.boundedElastic()).subscribe();
return Mono.empty();
});
这link可能与您的问题有关:
https://projectreactor.io/docs/core/release/reference/#faq.wrap-blocking
我希望我的请求触发一些长 运行 操作,该操作应在后台执行。 我编写了以下应该在后台处理我的操作的实现,但实际上我的请求是同步执行的:
@AsyncTimeout(10 * 60 * 1000)
@PostMapping("/dosomething")
Mono<Void> doSomething() {
return Mono.defer(() -> delay()).subscribeOn(Schedulers.elastic());
}
public static Mono<Void> delay() {
return Mono.fromRunnable(() -> {
LOG.info("Started sleep");
Uninterruptibles.sleepUninterruptibly(10, TimeUnit.SECONDS);
LOG.info("Finished sleep");
});
}
我在日志中看到以下内容:
14:29:58.801 DEBUG 1 --- [p1491676195-768] Incoming request for POST http://localhost:8989/dosomething
14:29:58.802 INFO 1 --- [ elastic-6] Started sleep
14:30:08.803 INFO 1 --- [ elastic-6] Finished sleep
14:30:08.806 DEBUG 1 --- [p1491676195-655] Outgoing response for POST http://localhost:8989/dosomething: 200
我看到我的 sleep
在另一个线程中执行,但由于某种原因,我的原始请求等待睡眠完成
更新 1:
@PostMapping("/dosomething")
Mono<Void> doSomething() {
return Mono.defer(() -> {
delay().subscribe();
return Mono.empty();
});
根据我读过的评论以及我对您的担忧的理解,如果您希望 运行 阻塞调用但 运行 它在后台立即返回响应服务调用,您可以简单地将 subscribeOn
添加到该进程,在您的示例中是 delay()
。这将使它 运行 在不同的线程中:
@PostMapping("/dosomething")
Mono<Void> doSomething() {
return Mono.defer(() -> {
delay().subscribeOn(Schedulers.boundedElastic()).subscribe();
return Mono.empty();
});
这link可能与您的问题有关: https://projectreactor.io/docs/core/release/reference/#faq.wrap-blocking