Frage

Angenommen, ich habe ein paar Feder Bohnen:

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

"B" stellt einen Remote-Dienst, die "A" nicht braucht. Es sei angenommen, daß „A“ eine nicht-negligble Zeit dauert, zu laden. Das bedeutet, dass bei einem Neustart Zyklus, die Anwendung den Remote-Client hängt, die an den Server tatsächlich eine Verbindung herstellen können, sondern wartet auf eine Antwort, bis die Feder Container initialisiert vollständig.

Was ich möchte in der Lage sein, den „B“ sofort Remote-Service reagieren zu tun ist, auch wenn (basierend auf dem Anwendungszustand) nur NOT_READY oder so zurückgeben kann. Der Behälter, zwingt jedoch eine Wartezeit, bis all seine Bohnen initialisiert werden, auch wenn Sie die Bohnen als lazy-init angeben und unabhängig von Ladereihenfolge.

Ich vermute, dass „B“ mit sofort zur Verfügung, die Feder zur Verfügung einen teilweise initialisierten Behälter müßte machen würde bedeuten, die schlecht klingt. Ich würde schätzen, jedoch ist jede Information jemand auf der Initialisierungsreihenfolge bekommt und ob Sie irgendwelche vernünftigen Abhilfen gefunden haben.

War es hilfreich?

Lösung

Sie beziehen sich nicht auf Bohne „A“ direkt. Vielmehr beziehen sich auf eine Bohne, die eine Fabrik für bean „A“ ist; Auf diese Weise kann die Fabrik Bohne zum Instanziieren „A“, ohne dabei die Initialisierung Treffer erstellt werden. Sie müssen Ihre Klassen, Refactoring, die mit einem „A“ bezeichnen ein „A“ zuerst abgerufen werden, natürlich.

Oder könnten Sie eine Bohne „AA“ erstellen, die einen Behälter für bean „A“ ist, der einen Initialisierungszustand hat, und das macht die Schnittstelle der Bean „A“; beim Aufruf, setzt er seinen Initialisierungszustand nicht initialisiert und beginnt mit der Initialisierung der bean „A“ in einem Thread; Anrufe zu jedem Interface-Methoden von „A“ auf „AA“ dann entweder Block oder einen nicht bereit Antwort zurück, bis die Initialisierung von „A“ innerhalb von „AA“ abgeschlossen hat.

Das alles irgendwie hängt davon ab, was Ihre Definition von „eine nicht zu vernachlässigende Zeit in Anspruch nimmt zu laden“ ist. Warum dauert es eine nicht zu vernachlässigende Menge an Zeit zu laden? Gibt es eine besonders schwierige Initialisierung, die in A los? Oder ist A gerade so monströs groß, dass sie die JVM Drosseln?

Andere Tipps

Ich verstehe nicht, warum „A eine nicht-negligble Zeit in Anspruch nimmt zu laden“, aber vielleicht könnten Sie zu einem faulen initialisieren Sie sich von A. Refactoring Verwenden InitializingBean nicht oder ein ApplicationEvent zu behandeln. initialisieren Sie hierfür auf den ersten Antrag behandelt werden. Dies wird die erste Anforderung verlangsamen!

Die andere Möglichkeit ist, die Initialisierung zu einem getrennten Thread durch den bean erstellt bewegen ein ApplicationEvent Handhabung. Der Thread ruft das Initialisierungsverfahren des Bohnen eine Async Weise. Seien Sie vorsichtig Anfragen an die nicht initialisierten Bohne zu handhaben!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top