Реактивные вызовы в функции @PostConstruct - PullRequest
1 голос
/ 05 апреля 2020

Может ли кто-нибудь помочь мне сделать следующее:

@PostContruct public void func() {
   webclient.get()...subscribe();
}

Вызов веб-клиента прекратится после того, как fun c () вернется. Скорее всего, это произойдет до того, как поступит первый запрос, но никаких гарантий. Другим вариантом является block (), что не отвечает цели реактивности.

Как правильно делать реактивные вызовы в методах @PostConstruct?

Спасибо.

1 Ответ

1 голос
/ 05 апреля 2020

Я создал простой компонент.

Синхронное обновление:

@Component
public class BeanTest {

    private String postConstructValue;

    @PostConstruct
    public void init(){
        try {
            Thread.sleep(5000);
            this.postConstructValue = "Construction done";
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Scheduled(fixedRate = 500)
    public void print(){
        System.out.println(
                this.postConstructValue
        );
    }

}
  • Потребовалось некоторое время для запуска приложения (более 5 секунд) потому что мы смоделировали некоторый трудоемкий процесс в пост-конструкции. Метод печати по расписанию начал печатать только после запуска приложения. Он начал печатать сообщение «Строительство завершено».

Асинхронное обновление:

@Component
public class BeanTest {

    private String postConstructValue;

    @PostConstruct
    public void init(){
        Flux.just("Construction done")
                .delayElements(Duration.ofSeconds(5))
                .subscribe(s -> this.postConstructValue = s);
    }

    @Scheduled(fixedRate = 500)
    public void print(){
        System.out.println(
                this.postConstructValue
        );
    }

}
  • Теперь при таком подходе приложение запускалось в течение 2 секунд , Способ печати, начиная печать null в течение нескольких секунд. Тогда это начало печатать "Строительство закончено". Это не прекращает обновление значения Flux postConstruct. Это произошло асинхронно.

Реактивный подход хорош, когда вам нужно неблокирующее поведение и выполнение чего-либо асинхронно. Если вы думаете, что создание вашего компонента должно ждать правильной конструкции, вам придется заблокировать! В противном случае вы можете go со вторым подходом.

...