如何在反应式环境中处理文件访问

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)

也达到了目的,就是比较丑