#project-reactor
#проект-реактор
Вопрос:
При использовании планировщика функция doFinally() выполняется до завершения всего Моно:
// Inside my component. var inner = Mono.just("a") .doFinally(s -gt; System.out.println("Finally")); // Component that uses my component. inner .flatMap(a -gt; Mono.just(a).publishOn(Schedulers.single())) .doOnSuccess(a -gt; System.out.println("Success")) .subscribe();
производит
Finally Success
Почему функция doFinally() выполняется перед функцией doOnSuccess()?
Если планировщик не используется, порядок будет таким, как ожидалось
Success Finally
В моем компоненте я хочу убедиться, что некоторая очистка произойдет, когда все Моно будет завершено. Кто этого добьется?
Комментарии:
1.
publishOn
заставляет программуdoOnSuccess
запускаться вsingle
планировщике. Каковы ваши ресурсы и почему вам нужно таким образом навести порядок?2. Я записываю загруженный HTML-контент на диск, чтобы уменьшить объем используемой кучи. Я хочу избавиться от этих временных файлов, когда запрос будет полностью обработан.
3. Поэтому вам нужен клиентский компонент для очистки. Внутренняя цепочка не знает, когда вся цепочка будет завершена.
4. Да, я мог бы это сделать, но я не хочу распространять эту логику на код. Я думал, что вся конструкция представляет собой одну цепочку, потому что сигналы доходят до конца цепочки. Разве это не так? Как я узнаю, где находятся границы? ИМО трудно понять, что в зависимости от планировщика (непосредственный или одиночный) поведение отличается.
5.
immediate
не меняет нить. Я не вижу пользы от использованияsingle
иpublishOn
в этот момент.