Java EE modo di garantire l'init di tutte le parti dell'ORECCHIO


Mi chiedo come sarebbe possibile garantire un init di un'applicazione completa senza avere il problema che alcuni componenti dell'applicazione possono essere accessibili o attivati.

Sto parlando di applicazioni Java EE 6/Java EE 7, che contengono più componenti WAR e EJB. L'applicazione EAR contiene bean guidati dai messaggi (attivati senza controllo da accessi esterni), Servlet (attivati/accessibili senza controllo da parte di utenti o sistemi di interfaccia) e TimerEJBs, che a sua volta ottiene attivato da una pianificazione definita.

Immagina, devi assicurarti all'avvio dell'applicazione EAR che le parti dell'applicazione debbano essere inizializzate. Ad esempio, esegui strumenti come le migrazioni di database, che potrebbero richiedere ore. Come è possibile in Java EE 6 / Java EE 7 controllare che nessuna delle parti sopra menzionate dell'applicazione possa essere eseguita fino a quando l'init non ha superato correttamente l'inizializzazione. E se l'inizializzazione non riesce, per rifiutare le operazioni su uno qualsiasi dei servizi in Java EE?

Spero di poter spiegare il mio problema nel modo corretto. In breve: come posso eseguire "Init" - code prima che venga eseguito qualsiasi altro codice della mia applicazione? E come posso evitare l'esecuzione di qualsiasi altro codice se il mio codice"Init" fallisce? Esiste uno standard Java EE 6 / Java EE 7 way? In caso contrario, esiste un modo jboss7 / wildfly?

Author: Arjan Tijms, 2014-07-26

1 answers

Ecco come abbiamo fatto:

Per ogni applicazione/servizio (ear o war, fai la tua scelta), avere un "startupFinished" @Startup @Singleton. questo singleton dipenderà da tutti gli altri singleton all'interno di quell'applicazione - quelli sarebbero i singleton che fanno tutto il lavoro di init effettivo (e per evitare insidie con l'inizializzazione pigra del riferimento è meglio chiamare un metodo isInitialized() su tutti loro).

Tutti gli MDB all'interno di un'applicazione dipendono da StartupFinished di tale applicazione singleton (vedi questa domanda per come).

Per le dipendenze tra le applicazioni (orecchie incrociate) - se A. ear dipende da B. ear avere un singleton StartupFinished di A iniettare StartupFinished di B (sarà necessario esporlo come EJB @Remote).

Ancora meglio, per farlo correttamente avrai bisogno di un singleton StartupStarted in A che dipende da quello StartupFinished di B - per assicurarti davvero che B sia completamente e completamente attivo prima che A inizi l'inizializzazione.

 3
Author: radai, 2017-05-23 12:28:28