首页 > 解决方案 > doFinally 是否在 Reactor 中的同一线程上执行

问题描述

doFinally 是否在同一个线程上执行?下面的代码会阻塞主线程吗?

mono
.map(fileName -> asyncDownloadFile(fileName, folderName))
.doFinally(v -> {
    FileUtils.cleanDirectory(folderName); // this method is blocking
});

如果是这样,在 doFinally 的单独线程中执行 cleanDirectory 的最佳方法是什么?

标签: javaspring-webfluxproject-reactorreactor

解决方案


将阻塞调用包装在 a 中Runnable并在单独的thread:

Runnable task = () -> {FileUtils.cleanDirectory(folderName)};

Mono<Object> cleanDirPromise = Mono.fromRunnable(task);

mono
.map(fileName -> asyncDownloadFile(fileName, folderName))
.doFinally(v -> {
    cleanDirPromise.subscribeOn(Schedulers.parallel()).subscribe();
});

注意:这本质上是一个即发即弃的调用,您不会真正关心cleanDirPromise.


推荐阅读