LINUX.ORG.RU

spring как сконфигурировать бин только после события?

 ,


0

1

Суть:

- есть spring netflix который содержит DiscoveryClient и публикует его не инициализированным (https://github.com/spring-cloud/spring-cloud-netflix/issues/48)

- есть jdbc DataSource который нужен хибернейту (и еще кучке чужого кода) во время инициализации приложения

- хост для DataSource мы вытаскиваем из DiscoveryClient, который, блин уже есть, но еще не готов

Как решить проблему (решение уже есть, но оно мне не по нраву)?

Решением была бы возможность «ждать бин», когда при появлении бина в контексте зависящие от него инициализируются (тогда яб просто отложил публикацию DataSource до лучших времен), но спринг так не умеет.

Deleted
Ответ на: комментарий от roy

омг, что лениво инициализировать если датасурс используется хибернейтом еще до старта приложения?

Deleted
()
Ответ на: комментарий от Deleted

Если ты на это смотрел и оно не работает - ок, у меня со спрингом опыта не много. Если я правильно понимаю, то сделав хибернейт и датасурс ленивыми, датасурс полезет в DiscoveryClient только когда кто-то попросит хибернейта. Возможно это не сработает в твоей конфигурации.

roy ★★★★★
()
Ответ на: комментарий от roy

когда кто-то попросит хибернейта

Там его одна шняга просит на этапе инициализации, и это никак не изменить - тому що это сторонний код с которым сделать ничего нельзя.

Еслиб можно было не юзать DataSource на этапе инициализации то это вообще не было бы проблемой.

Deleted
()

Я бы заэкстендил DefaultLifecycleProcessor.start и SmartLifecycle чтобы можно было получать callback и при инициализации клиента дергал его. Возможно даже отправил бы это в апстрим
Это в случае если от DiscoveryClient-та можно получить эвент о том что он готов, иначе нужно отрывать его авторам руки.

maloi ★★★★★
()
Ответ на: комментарий от maloi

Хотя по твоей ссылке же все написано - достаточно дергать метод start перед использованием клиента.
Если ты опасаешься тех же race condition-ов, что и авторы, то можно его вынести в родительский контекст, который инициализируется до всего остального.

maloi ★★★★★
()
Ответ на: комментарий от maloi

заэкстендил DefaultLifecycleProcessor.start и SmartLifecycle чтобы можно было получать callback и при инициализации клиента дергал его.

Реализовать SmartLifecycle в конфигурации поставляющую датасурс, и дернуть ее start вручную из кастомного DefaultLifecycleProcessor ?

Эвент от DiscoveryClient есть.

Deleted
()
Ответ на: комментарий от maloi

ну я щас и дергаю его, только он регистрирует приложение в eureka с кривыми аттрибутами - хотя это чинится, но я опасаюсь неожиданных глюков - учитывая какие там внутри костыли.

https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud...

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

только он регистрирует приложение в eureka с кривыми аттрибутами

Ну видимо нужно в родительский контекст выносить его одного, а в дочернем создавать остальные бины

maloi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.