Orden de inicialización de primavera

Supongamos que tengo un par de frijoles primavera:


   
   

"B" expone un servicio remoto que no necesita "A". Supongamos que "A" tarda un tiempo no despreciable en cargarse. 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 de resorte se inicialice por completo.

Lo que me gustaría hacer es hacer que el servicio remoto "B" responda de inmediato, incluso si (en función del estado de la aplicación) solo puede devolver NOT_READY o algo así. El contenedor, sin embargo, obliga a esperar hasta que todos sus beans se hayan inicializado, incluso si especifica los beans como lazy-init e independientemente del orden de carga.

Sospecho que tener "B" disponible inmediatamente significaría que la primavera 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 en el pedido de inicialización y si ha encontrado alguna solución razonable.

2
¿Podrían explicar por qué Bean A toma un "tiempo no despreciable" para crear una instancia propia? ¿Es posible que una respuesta vuelva a factorizar Bean A para que el tiempo no despreciable se convierta en una función llamada fuera del proceso de creación de instancias?
agregado el autor David Harrison, fuente

2 Respuestas

No se refiera a bean "A" directamente. En su lugar, consulte un bean que es una FÁBRICA para bean "A"; de esta forma, Factory Bean se puede crear sin tomar el golpe de inicialización para crear una instancia de "A". Necesitarás refactorizar tus clases que se refieren a una "A" para recuperar una "A" primero, por supuesto.

O bien, podría crear un "AA" de frijol, que es un contenedor para el frijol "A", que tiene un estado de inicialización, y que expone la interfaz del frijol "A"; al invocarlo, establece su estado de inicialización para que no se inicialice, y comienza la inicialización del bean "A" en algún hilo; las llamadas a cualquier método de interfaz de "A" en "AA" pueden bloquear o devolver una respuesta no lista, hasta que se complete la inicialización de "A" dentro de "AA".

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

3
agregado

No entiendo por qué "A toma un tiempo no despreciable en cargar", pero tal vez podría iniciarse en un modo perezoso mediante la refacturación A. No use InitializingBean ni maneje un ApplicationEvent. Simplemente inicialízate en la primera solicitud para ser manejada. ¡Esto ralentizará la primera solicitud!

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

0
agregado
Mientras A cargas, las llamadas se cuelgan hasta el tiempo de espera, ya que pueden abrir un socket pero esperan a que se complete la inicialización del servidor. Quiere cargar el servicio manualmente para responder de inmediato. Esperaba evitar la desordenada alternativa de inicialización en un hilo de fondo iniciado manualmente.
agregado el autor Steve B., fuente