【发布时间】:2022-01-24 13:03:48
【问题描述】:
我尝试创建两个 api 端点,一个是响应式的,另一个是普通函数(不知道我们怎么称呼它,如果你知道,请告诉我:p)
所以根据理论,如果我同时击中 Reactive 端点两到三次,返回 Mono<String> 和 time 变量说 10000ms,那么应用程序会正常运行,它不会阻塞并运行在预期的单独线程上。但是在正常功能下,行为也是一样的,为什么会这样呢?它不应该阻塞线程并阻塞另一个api调用直到第一个返回吗?
我想看看Mono&Flux 是如何实现异步行为的?它真的有什么不同?
@GetMapping(path = "/testing")
public String testing(@RequestParam(value = "time") Long time) throws InterruptedException {
log.info("Thread {}", Thread.currentThread().getName());
Thread.sleep(time);
return "RETURNING" + String.valueOf(time);
}
@GetMapping(path = "/testingFlux")
public Mono<String> testinging(@RequestParam(value = "time") Long time) throws InterruptedException {
log.info("Thread {}", Thread.currentThread().getName());
Thread.sleep(time);
return Mono.just("RETURNING" + String.valueOf(time));
}
【问题讨论】:
-
你所说的“vanilla java”被称为“servlet stack”,或者在spring世界中,“SpringMVC”。也许在将其与 Reactive 模型进行比较之前先尝试了解它是如何工作的,因为您关于它阻止其他 api 调用的假设是错误的。
-
您作为第二个示例发布的代码不是反应式的,它只是对反应器库的错误使用。正如所指出的,学习 servlet 堆栈是如何工作的……然后学习如何使用反应器库进行实际编码。然后再试一次。
标签: java spring spring-boot reactive-programming spring-webflux