如何在反应式环境中处理文件访问
How to handle file access in a reactive environment
我正在将一些阻塞代码重构为响应式代码(使用 Reactor)。我认为 java.nio.file.Files
class 中的大多数方法都是阻塞的。
如果我替换这样的方法是否正确:
public boolean exists() {
return Files.exists(path);
}
与:
public Mono<Boolean> exists() {
return Mono.fromSupplier(() -> Files.exists(path));
}
我认为这是必要的,尤其是在使用廉价硬盘的情况下。
或者 Reactor 中是否存在用于此类文件操作的库?
通常是的,但您的代码遗漏了一个重要部分:分配调度程序。
一些调用是否通过包装成 Mono
来装饰并不重要。重要的是代码运行的调度程序(线程)。您的代码错过了一个 .subscribeOn(boundedElastic())
调用。
(Schedulers.boundedElastic()
是 a good choice 涉及阻止 I/O 的工作)。
或者,线程 运行 可以通过 .publishOn()
调用更改代码。例如。如果您处理现有的 Flux<Path>
(而不是您的情况下的简单 Path
值),您可以使用 .publishOn()
来切换线程,使用简单的 map()
来调用阻塞方法。例如:
Mono.just(path).publishOn(Schedulers.boundedElastic()).map(Files::exists)
也达到了目的,就是比较丑
我正在将一些阻塞代码重构为响应式代码(使用 Reactor)。我认为 java.nio.file.Files
class 中的大多数方法都是阻塞的。
如果我替换这样的方法是否正确:
public boolean exists() {
return Files.exists(path);
}
与:
public Mono<Boolean> exists() {
return Mono.fromSupplier(() -> Files.exists(path));
}
我认为这是必要的,尤其是在使用廉价硬盘的情况下。
或者 Reactor 中是否存在用于此类文件操作的库?
通常是的,但您的代码遗漏了一个重要部分:分配调度程序。
一些调用是否通过包装成 Mono
来装饰并不重要。重要的是代码运行的调度程序(线程)。您的代码错过了一个 .subscribeOn(boundedElastic())
调用。
(Schedulers.boundedElastic()
是 a good choice 涉及阻止 I/O 的工作)。
或者,线程 运行 可以通过 .publishOn()
调用更改代码。例如。如果您处理现有的 Flux<Path>
(而不是您的情况下的简单 Path
值),您可以使用 .publishOn()
来切换线程,使用简单的 map()
来调用阻塞方法。例如:
Mono.just(path).publishOn(Schedulers.boundedElastic()).map(Files::exists)
也达到了目的,就是比较丑