Используя 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()
в коде похоже на взлом. Что-то не так с моим кодом или моим пониманием?