Как обрабатывать доступ к файлам в реактивной среде - PullRequest
0 голосов
/ 14 июля 2020

Я перевожу код блокировки на реактивный (с помощью Reactor). Я думаю, что большинство методов в классе java.nio.file.Files блокируются.

Правильно, если я заменю такой метод, как:

public boolean exists() {
    return Files.exists(path);
}

на:

public Mono<Boolean> exists() {
    return Mono.fromSupplier(() -> Files.exists(path));
}

Думаю, это необходимо, особенно при использовании дешевых жестких дисков.

Или в Reactor существует библиотека для такого рода манипуляций с файлами?

1 Ответ

2 голосов
/ 18 июля 2020

Обычно да, но в вашем коде отсутствует одна важная часть: назначение планировщика.

На самом деле не имеет значения, оформлен ли какой-либо вызов, заключив его в Mono. Важно то, в каком планировщике (потоке) выполняется этот код. Ваш код пропускает вызов .subscribeOn(boundedElastic()).

(Schedulers.boundedElastic() - хороший выбор для работы, связанной с блокировкой ввода-вывода).

В качестве альтернативы выполняется поток код можно изменить, позвонив по номеру .publishOn(). Например, если вы имеете дело с существующим Flux<Path> (вместо простого Path значения, как в вашем случае), вы можете использовать .publishOn() для переключения потоков и простой map() для вызова метода блокировки. Например:

Mono.just(path).publishOn(Schedulers.boundedElastic()).map(Files::exists)

тоже достигает цели, но более некрасиво.

...