Question

Supposons que j'ai quelques haricots de printemps:

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

" B " expose un service distant qui n'a pas besoin de "A". Supposons que " A " prend un temps non négligeable à charger. Cela signifie que pendant un cycle de redémarrage, l'application bloque le client distant, qui peut en réalité se connecter au serveur mais attend une réponse jusqu'à ce que le conteneur de ressort soit complètement initialisé.

Ce que j'aimerais pouvoir faire, c’est le " B " le service distant répond immédiatement, même si (en fonction de l'état de l'application), il ne peut que renvoyer NOT_READY, ou autre. Cependant, le conteneur oblige à attendre que tous ses beans soient initialisés, même si vous spécifiez les beans comme lazy-init et indépendamment de l'ordre de chargement.

Je soupçonne qu’avoir " B " disponible immédiatement signifierait que spring devrait mettre à disposition un conteneur partiellement initialisé, ce qui sonne mal. Cependant, je vous serais reconnaissant de toute information sur l’instruction d’initialisation et de savoir si vous avez trouvé des solutions de contournement raisonnables.

Était-ce utile?

La solution

Ne faites pas référence au haricot " A " directement. Faites plutôt référence à un haricot qui est une USINE pour le haricot "A"; De cette manière, le bean Factory peut être créé sans prendre le hit d'initialisation pour instancier "A". Vous devrez refactoriser vos cours qui font référence à un "A". pour récupérer un " A " d'abord, bien sûr.

Vous pouvez également créer un haricot "AA", qui est un conteneur pour le haricot "A", qui a un état d'initialisation et qui expose l'interface du haricot "A"; lors de l'invocation, il définit son état d'initialisation sur non initialisé et commence l'initialisation du bean "A". en quelque fil; appels à n’importe quelle méthode d’interface de " A " sur " AA " peut alors bloquer ou renvoyer une réponse non prête, jusqu'à l'initialisation de "A" dans " AA " a terminé.

Tout dépend de ce que votre définition de "prend un temps non négligeable pour charger". est. Pourquoi faut-il un temps non négligeable pour charger? Une initialisation particulièrement délicate est-elle en cours dans A? Ou est-ce que A est si gigantesque qu’elle étouffe la JVM?

Autres conseils

Je ne comprends pas pourquoi "A prend un temps non négligeable pour charger", mais vous pourriez peut-être vous initialiser paresseux en refacturant A. N'utilisez pas InitializingBean ou ne gérez pas ApplicationEvent. Il suffit d’initialiser la première demande à traiter. Cela ralentira la première demande!

L’autre possibilité est de déplacer l’initialisation vers un thread séparé créé par le bean gérant un événement ApplicationEvent. Le thread appelle la méthode d'initialisation du bean de manière asynchrone. Faites attention à ne pas traiter les requêtes au bean non initialisé!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top