Почему функция doFinally() запускается рано при использовании планировщика?

#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 в этот момент.