Domanda

Supponiamo di avere un paio di fagioli primaverili:

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

" B " espone un servizio remoto che non necessita di "A". Supponi che " A " richiede un tempo non trascurabile per caricare. Ciò significa che durante un ciclo di riavvio, l'applicazione blocca il client remoto, che può effettivamente connettersi al server ma attende una risposta fino all'inizializzazione completa del contenitore a molla.

Quello che mi piacerebbe poter fare è avere il "B" il servizio remoto risponde immediatamente, anche se (in base allo stato dell'applicazione) può solo restituire NOT_READY o alcuni di questi. Il contenitore, tuttavia, impone un'attesa fino all'inizializzazione di tutti i bean, anche se si specificano i bean come lazy-init e indipendentemente dall'ordine di caricamento.

Sospetto che avere " B " disponibile immediatamente significherebbe che la primavera dovrebbe rendere disponibile un contenitore parzialmente inizializzato, il che suona male. Tuttavia, apprezzerei tutte le informazioni che qualcuno ha ricevuto sull'ordine di inizializzazione e se hai trovato soluzioni alternative ragionevoli.

È stato utile?

Soluzione

Non fare riferimento al bean " A " direttamente. Invece, fare riferimento a un bean che è una FABBRICA per bean "A"; in questo modo, il bean Factory può essere creato senza subire il colpo di inizializzazione per creare un'istanza di "A". Dovrai effettuare il refactoring delle tue classi che si riferiscono a un " A " per recuperare un "A" prima, ovviamente.

Oppure, è possibile creare un bean "AA", che è un contenitore per bean "A", che ha uno stato di inizializzazione e che espone l'interfaccia del bean "A"; su invocazione, imposta il suo stato di inizializzazione su non inizializzato e inizia l'inizializzazione del bean "A" in qualche filo; chiama a qualsiasi metodo di interfaccia di "A" su " AA " può quindi bloccare o restituire una risposta non pronta, fino all'inizializzazione di "A" entro " AA " ha completato.

Tutto questo in qualche modo dipende da ciò che la tua definizione di "richiede un tempo non trascurabile per caricare" è. Perché il caricamento richiede un tempo non trascurabile? C'è qualche inizializzazione particolarmente delicata che sta avvenendo all'interno di A? O A è così mostruosamente enorme da soffocare la JVM?

Altri suggerimenti

Non capisco, perché "A richiede un tempo non trascurabile per caricare", ma forse potresti inizializzarti pigro eseguendo il refactoring A. Non utilizzare InitializingBean o gestire un ApplicationEvent. Inizializza la prima richiesta da gestire. Questo rallenterà la prima richiesta!

L'altra possibilità è spostare l'inizializzazione in un thread separato creato dal bean che gestisce un ApplicationEvent. Il thread chiama il metodo di inizializzazione del bean in modo asincrono. Fai attenzione a gestire le richieste al bean non inizializzato!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top