Primul ordin de inițializare

Să presupunem că am câteva fasole de primăvară:


   
   

"B" expune un serviciu la distanță care nu are nevoie de "A". Să presupunem că "A" durează un timp neglijabil pentru încărcare. Ceea ce înseamnă că în timpul unui ciclu de repornire aplicația blochează clientul la distanță, care se poate conecta la server, dar așteaptă un răspuns până când containerul de primăvară se iniționează complet.

Ceea ce aș vrea să pot face este să răspund imediat serviciul la distanță "B", chiar dacă (în funcție de starea aplicației) se poate întoarce doar NOT_READY sau altele asemenea. Cu toate acestea, containerul forțează o așteptare până când toate fasolele sunt inițializate, chiar dacă specificați fasolea ca fiind leneș și dacă nu aveți o ordine de încărcare.

Bănuiesc că faptul că "B" este disponibil imediat înseamnă că primăvara ar trebui să pună la dispoziție un container parțial inițializat, care pare rău. Cu toate acestea, aș aprecia orice informație pe care o are cineva despre ordinea de inițializare și dacă ați găsit soluții rezonabile.

2
Ai putea elabora de ce Bean A ia un "timp neglijabil" pentru a se instantiza? Este un răspuns posibil ca factorul Bean A să se refacă astfel încât timpul non-neglijabil să devină o funcție numită în afara procesului de instanțiere?
adăugat autor David Harrison, sursa

2 răspunsuri

Nu te referi direct la fasole "A". În schimb, se referă la o fasole care este o FABRICĂ pentru fasole "A"; în acest fel, fabrica de fasole poate fi creată fără a lua lovitura de inițializare pentru instanțierea "A". Va trebui să refaceți clasele care se referă la un "A" pentru a obține un "A" mai întâi, desigur.

Sau puteți crea o fasole "AA", care este un recipient pentru fasole "A", care are o stare de inițializare și care expune interfața fasolei "A"; la invocare, își stabilește starea inițială pentru a nu inițializa și începe inițierea fasolei "A" într-un fir; apelurile la orice interfață metode de "A" pe "AA" poate apoi să blocheze sau să returneze un răspuns gata, până când inițializarea "A" în cadrul "AA" a fost finalizată.

Acest lucru depinde destul de mult de ceea ce definiția dvs. "are un timp neglijabil de încărcat" este. De ce durează o perioadă de încărcare? Există o inițiere deosebit de dificilă care se întâmplă în cadrul A? Sau este chiar așa de monstruos de mare încât să-l ducă pe JVM?

3
adăugat

Eu nu inteleg, de ce "A ia un timp non-neglijabil pentru a incarca", dar poate ai putea sa te initializezi printr-un refactoring A. Nu foloseste InitializingBean sau nu manevrezi un ApplicationEvent. Trebuie doar să inițializați prima solicitare de tratat. Acest lucru va încetini prima solicitare!

Cealaltă posibilitate este să mutați inițializarea la un fir separat, creat de beanul care manipulează un ApplicationEvent. Fișierul solicită metoda de inițializare a fasolei o modalitate de asincronizare. Fii atent să te ocupi de Cererile la fasole neinitializată!

0
adăugat
În timpul încărcării A, apelanții atârnă până la expirarea timpului, deoarece pot deschide un soclu, dar așteaptă să se finalizeze inițializarea serverului. Vrei să încărcați manual serviciul pentru a răspunde imediat. Speram să evităm alternativa dezordonată de inițializare într-un file de fundal inițiat manual.
adăugat autor Steve B., sursa