Pregunta

Supongamos que tengo un par de frijoles de primavera:

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

" B " expone un servicio remoto que no necesita "A". Suponga que " A " toma un tiempo no insignificante para cargar. Lo que esto significa es que durante un ciclo de reinicio, la aplicación bloquea el cliente remoto, que en realidad puede conectarse al servidor, pero espera una respuesta hasta que el contenedor Spring se inicialice por completo.

Lo que me gustaría poder hacer es tener la "B" el servicio remoto responde de inmediato, incluso si (según el estado de la aplicación) solo puede devolver NOT_READY o algo similar. Sin embargo, el contenedor obliga a esperar hasta que todos sus beans se inicialicen, incluso si especifica los beans como lazy-init e independientemente del orden de carga.

Sospecho que tener "B" disponible de inmediato significaría que Spring tendría que poner a disposición un contenedor parcialmente inicializado, lo que suena mal. Sin embargo, agradecería cualquier información que alguien tenga sobre el pedido de inicialización y si ha encontrado soluciones razonables.

¿Fue útil?

Solución

No se refiera al bean " A " directamente. En cambio, refiérase a un bean que es una FÁBRICA para bean '' A ''; de esta manera, se puede crear el bean Factory sin tomar el hit de inicialización para instanciar " A " ;. Tendrá que refactorizar sus clases que se refieren a una " A " para recuperar una " A " primero, por supuesto.

O, podría crear un bean '' AA '', que es un contenedor para el bean '' A '', que tiene un estado de inicialización, y que expone la interfaz del bean '' A ''; tras la invocación, establece su estado de inicialización en no inicializado y comienza la inicialización del bean " A " en algún hilo; llamadas a cualquier método de interfaz de " A " en " AA " entonces puede bloquear o devolver una respuesta no preparada, hasta la inicialización de " A " dentro de "AA" ha completado.

Todo esto depende de lo que su definición de "toma un tiempo insignificante para cargar". es. ¿Por qué lleva una cantidad de tiempo no despreciable cargar? ¿Hay alguna inicialización particularmente complicada que esté ocurriendo dentro de A? ¿O es A tan monstruosamente enorme que ahoga la JVM?

Otros consejos

No entiendo, por qué " A tarda un tiempo no despreciable en cargar " ;, pero tal vez usted podría inicializarse perezosamente refactorizando A. No use InitializingBean ni maneje un ApplicationEvent. Simplemente inicialice en la primera Solicitud a manejar. ¡Esto ralentizará la primera solicitud!

La otra posibilidad es mover la inicialización a un hilo separado creado por el bean que maneja un ApplicationEvent. El hilo llama al método de inicialización del bean de forma asíncrona. ¡Tenga cuidado de manejar las solicitudes al bean no inicializado!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top