У меня есть ситуация, когда одному из моих классов необходимо выполнить некоторые задачи инициализации при запуске приложения. Этот класс зависит от другого компонента, который также необходимо инициализировать при запуске. Я использую Quarkus и пометил зависимый компонент @Startup
, чтобы гарантировать его раннюю инициализацию. Однако я наблюдаю, что метод инициализации в моем основном классе, который прослушивает StartupEvent
, выполняется до инициализации зависимого компонента. Это приводит к таким проблемам, как невозможность использования зависимого компонента, когда мой основной класс пытается его использовать, что приводит к исключениям. Как я могу гарантировать, что зависимый компонент будет полностью инициализирован до того, как мой основной класс начнет процесс инициализации в Quarkus?
Весной я мог бы использовать @DependsOn
, которого нет в Quarkus.
Я пытался использовать @Priority
, но в моем случае это не сработало.
Есть ли у кого-нибудь идеи, как я могу контролировать последовательность инициализации этих компонентов?
@Startup#value()
может использоваться для указания приоритета сгенерированного метода наблюдателя и, таким образом, влияет на порядок. Другими словами, если вы аннотируете класс @Startup(10)
, это будет выглядеть примерно так:
void start(@Observes @Priority(10) StartupEvent event, YourBean bean) {
// some code that makes sure the bean is initialized
}
Есть законный вариант использования @Startup @Dependent
бобов. Т.е. если вам нужно выполнить некоторую логику запуска без сохранения состояния. Обратите внимание, что @Startup
также можно объявлять в методах. См. также quarkus.io/guides/lifecycle#startup_annotation.
Я должен помнить одну вещь: если вы используете
@Startup
, вам, скорее всего, это не нужно для@Dependent
bean-компонентов, поскольку такой bean-компонент будет создан для целей наблюдателя и впоследствии уничтожен ([задокументировано здесь] [1]), что соответствует поведению спецификации. [1]: quarkus.io/guides/lifecycle#startup_annotation