В моем приложении Spring я хочу выполнить некоторые подготовительные действия (например, для разогрева кешей) в ApplicationReadyEvent
слушателях, прежде чем зарегистрировать его в Eureka. Проблема в том, что мое приложение стало доступным в Eureka для других приложений до того, как оно завершит всю подготовку, что может вызвать некоторые проблемы позже.
К сожалению, я не могу найти какой-либо удобный способ отложить регистрацию до полной инициализации приложения.
То, что я пробовал:
- Я установил
eureka.instance.initial-status
на что угодно, кроме "вверх" (например, на "старт"), но, как я понял, Эврика проверяет здоровье в игру и устанавливает текущее состояние «вверх» даже до ContextRefreshedEvent
или около того. В этом случае я могу отключить проверку работоспособности с помощью eureka.client.healthcheck.enabled = false
, но позже мне нужно создать компонент EurekaHealthCheckHandler
, а ApplicationReadyEvent
, а затем вручную зарегистрировать его в контексте приложения. - Другой подход - установить
spring.cloud.service-registry.auto-registration.enabled = false
. Кажется, что регистрация в этом случае вызывается позже (после всех моих ApplicationReadyEvent
слушателей), но bean-компонент EurekaRegistration
не создается автоматически, поэтому я закончил с его созданием вручную снова (оно понадобится приложению позже). - Также я играл с
eureka.*
свойствами интервала (например, eureka.initialInstanceInfoReplicationIntervalSeconds
). В этом случае вы должны быть в состоянии предсказать окончательное время, которое займет подготовка, что, на мой взгляд, ненадежно.
Таким образом, в любое время вам нужно правильно установить группу свойств и затем создать и настроить множество вещей вручную. Довольно громоздко для (я думаю) общей задачи.
Есть ли лучший подход? Может быть, я что-то упустил и решение на поверхности?
Я использую Spring Boot 2.1.9 с Spring Cloud Greenwich.
Заранее спасибо.