Java 如何在反应式环境中处理文件访问
我正在将一些阻塞代码重构为反应性代码(使用Reactor)。我认为Java 如何在反应式环境中处理文件访问,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,我正在将一些阻塞代码重构为反应性代码(使用Reactor)。我认为java.nio.file.Files类中的大多数方法都是阻塞的 如果我替换以下方法是否正确: public boolean exists() { return Files.exists(path); } 与: public Mono exists(){ 返回Mono.fromSupplier(()->Files.exists(path)); } 我认为这是必要的,尤其是当使用廉价的硬盘时 或者Reactor中是否存在
java.nio.file.Files
类中的大多数方法都是阻塞的
如果我替换以下方法是否正确:
public boolean exists() {
return Files.exists(path);
}
与:
public Mono exists(){
返回Mono.fromSupplier(()->Files.exists(path));
}
我认为这是必要的,尤其是当使用廉价的硬盘时
或者Reactor中是否存在用于此类文件操作的库?通常是的,但您的代码忽略了一个重要部分:分配调度程序 是否通过将某个调用包装成
Mono
来修饰它并不重要。重要的是代码在哪个调度程序(线程)上运行。您的代码错过了一个.subscribeOn(boundedElastic())
调用
(Schedulers.boundedElastic()
用于涉及阻塞I/O的工作)
或者,可以通过调用.publishOn()
来更改运行代码的线程。例如,如果您处理现有的流量
(而不是简单的路径
值,您可以使用.publishOn()
切换线程,使用简单的映射()
调用阻塞方法。例如:
Mono.just(path).publishOn(Schedulers.boundedElastic()).map(Files::exists)
也实现了这个目标,尽管它更难看。通常是的,但您的代码忽略了一个重要部分:分配调度程序 是否通过将某个调用包装成
Mono
来修饰它并不重要。重要的是代码在哪个调度程序(线程)上运行。您的代码错过了一个.subscribeOn(boundedElastic())
调用
(Schedulers.boundedElastic()
用于涉及阻塞I/O的工作)
或者,可以通过调用.publishOn()
来更改运行代码的线程。例如,如果您处理现有的流量
(而不是简单的路径
值,您可以使用.publishOn()
切换线程,使用简单的映射()
调用阻塞方法。例如:
Mono.just(path).publishOn(Schedulers.boundedElastic()).map(Files::exists)
也达到了目标,但更丑陋。这似乎是我见过的一般方法。这似乎是我见过的一般方法。