Порядок инициализации Quarkus Bean

У меня есть ситуация, когда одному из моих классов необходимо выполнить некоторые задачи инициализации при запуске приложения. Этот класс зависит от другого компонента, который также необходимо инициализировать при запуске. Я использую Quarkus и пометил зависимый компонент @Startup, чтобы гарантировать его раннюю инициализацию. Однако я наблюдаю, что метод инициализации в моем основном классе, который прослушивает StartupEvent, выполняется до инициализации зависимого компонента. Это приводит к таким проблемам, как невозможность использования зависимого компонента, когда мой основной класс пытается его использовать, что приводит к исключениям. Как я могу гарантировать, что зависимый компонент будет полностью инициализирован до того, как мой основной класс начнет процесс инициализации в Quarkus?

Весной я мог бы использовать @DependsOn, которого нет в Quarkus.

Я пытался использовать @Priority, но в моем случае это не сработало.

Есть ли у кого-нибудь идеи, как я могу контролировать последовательность инициализации этих компонентов?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

@Startup#value() может использоваться для указания приоритета сгенерированного метода наблюдателя и, таким образом, влияет на порядок. Другими словами, если вы аннотируете класс @Startup(10), это будет выглядеть примерно так:

void start(@Observes @Priority(10) StartupEvent event, YourBean bean) {
   // some code that makes sure the bean is initialized
}

Я должен помнить одну вещь: если вы используете @Startup, вам, скорее всего, это не нужно для @Dependent bean-компонентов, поскольку такой bean-компонент будет создан для целей наблюдателя и впоследствии уничтожен ([задокументировано здесь] [1]), что соответствует поведению спецификации. [1]: quarkus.io/guides/lifecycle#startup_annotation

Siliarus 14.06.2024 09:35

Есть законный вариант использования @Startup @Dependent бобов. Т.е. если вам нужно выполнить некоторую логику запуска без сохранения состояния. Обратите внимание, что @Startup также можно объявлять в методах. См. также quarkus.io/guides/lifecycle#startup_annotation.

Martin Kouba 17.06.2024 12:53

Другие вопросы по теме