Почему обновляемый компонент не инициализируется при вызове метода компонента? - PullRequest
0 голосов
/ 21 февраля 2020

Используя Micronaut, у меня есть обновляемый компонент, который я тоже хочу инициализировать. Я не думаю, что возможно объединить аннотации @Refreshable и @Context, поэтому я должен выполнить активную инициализацию вручную. Но это не работает так, как я ожидаю. У меня есть следующие классы:

@Refreshable
public class MyRefreshableBean {

    private static final Logger LOG = LoggerFactory.getLogger(MyRefreshableBean.class);

    @PostConstruct
    public void postConstruct() {
        LOG.info("postConstruct");
    }

    public void tryToForceInitialization() {
        LOG.info("tryToForceInitialization");
    }
}

и

public class Application {

    private static final Logger LOG = LoggerFactory.getLogger(Application.class);
    private static ApplicationContext ac;

    public static void main(String[] args) {
        ac = Micronaut.run(Application.class);
        ac.getBean(MyRefreshableBean.class).tryToForceInitialization();
    }

    @Scheduled(initialDelay = "5s")
    public void delayed() throws InterruptedException {
        LOG.info("delayed");
        ac.publishEvent(new RefreshEvent());
        Thread.sleep(1000);
        ac.getBean(MyRefreshableBean.class).tryToForceInitialization();
    }
}

Кажется, postConstruct() не вызывается после контекста refre sh, если a) компонент уже был инициализирован в main() и б) нет задержки после отправки события refre sh. Наличие Thread.sleep() в коде похоже на взлом. Что-то не так с моим кодом или моим пониманием?

...