Вопрос

Предположим, у меня есть пара весенних бобов:

<beans>
   <bean name="A" ... />
   <bean name="B" ... />
</beans>

«B» предоставляет удаленную службу, которой не требуется «A».Предположим, что для загрузки «А» требуется немалое время.Это означает, что во время цикла перезапуска приложение зависает удаленный клиент, который фактически может подключиться к серверу, но ждет ответа до полной инициализации контейнера Spring.

Я хотел бы иметь возможность немедленного ответа удаленной службы «B», даже если (в зависимости от состояния приложения) она может возвращать только NOT_READY или что-то в этом роде.Контейнер, однако, заставляет ждать, пока все его bean-компоненты не будут инициализированы, даже если вы укажете bean-компоненты как lazy-init и независимо от порядка загрузки.

Я подозреваю, что немедленное наличие «B» будет означать, что Spring придется предоставить частично инициализированный контейнер, что звучит плохо.Тем не менее, я был бы признателен за любую информацию о порядке инициализации и о том, нашли ли вы какие-либо разумные обходные пути.

Это было полезно?

Решение

Не обращайтесь напрямую к компоненту «А».Вместо этого обратитесь к компоненту, который является FACTORY для компонента «A»;таким образом, компонент Factory может быть создан без выполнения инициализации для создания экземпляра «A».Конечно, вам нужно будет провести рефакторинг ваших классов, которые ссылаются на «А», чтобы сначала получить «А».

Или вы можете создать компонент «AA», который является контейнером для компонента «A», который имеет состояние инициализации и предоставляет интерфейс компонента «A»;при вызове он устанавливает состояние инициализации как не инициализировано и начинает инициализацию компонента «A» в каком-либо потоке;вызовы любых методов интерфейса «A» на «AA» могут затем либо заблокировать, либо вернуть ответ «не готов», пока инициализация «A» внутри «AA» не завершится.

Все это в некотором роде зависит от вашего определения «загрузка занимает немалое время».Почему загрузка занимает немалое количество времени?Есть ли какая-то особенно сложная инициализация, происходящая внутри A?Или A настолько чудовищно огромен, что душит JVM?

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

Я не понимаю, почему «Загрузка A требует немалого времени», но, возможно, вы могли бы лениво инициализировать себя, реорганизовав A.Не используйте InitializingBean и не обрабатывайте ApplicationEvent.Просто инициализируйте первый запрос, который будет обработан.Это замедлит выполнение первого запроса!

Другая возможность — перенести инициализацию в отдельный поток, созданный компонентом, обрабатывающим ApplicationEvent.Поток вызывает метод инициализации компонента асинхронно.Будьте осторожны при обработке запросов к неинициализированному компоненту!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top