2015-05-03 18 views
5

Sto imparando su EJB, finora ho letto che multi-threading non è consentito in EJB'S, perché è il contenitore che dovrebbe preoccuparsi della sicurezza dei thread e lasciare che lo sviluppatore si concentri solo nel business logica, quindi in pratica significa che EJB garantisce che solo un thread abbia accesso contemporaneamente a un metodo in un bean Session.Multi-threading in EJB

Cosa succede quando molti utenti accedono allo stesso metodo in un EJB? Il contenitore sta serializzando gli acces o sta creando diverse istanze del bean, una per thread?

Qualcuno potrebbe spiegarmi qual è la politica in merito? Inoltre sono un po 'confuso, perché se il multithreading non è consentito, quindi non possiamo creare i nostri thread, perché abbiamo questa annotazione @Asynchronous?

risposta

7

Sì, crea diverse istanze e le raggruppa. Vedere la official Oracle documentation:

Perché un session bean stateless non viene mai passivato, suo ciclo di vita ha solo due fasi: inesistenti e pronti per l'invocazione dei metodi commerciali. La Figura 22-4 illustra le fasi di un bean di sessione stateless.

Il contenitore EJB crea e gestisce in genere un pool di bean di sessione stateless, iniziando il ciclo di vita del bean di sessione stateless. Il contenitore esegue un'iniezione di dipendenza e quindi richiama il metodo annotato @PostConstruct, se esiste. Il bean è ora pronto ad avere i suoi metodi di business invocati da un client.

Alla fine del ciclo di vita, il contenitore EJB chiama il metodo annotato @PreDestroy, se esiste. L'istanza del bean è quindi pronta per la garbage collection.

+0

Domanda veloce, la sincronizzazione è eseguita a livello di metodo o di classe? Se ho ben capito, se due utenti provano ad accedere allo stesso metodo nella stessa istanza EJB, il contenitore EJB creerà un'altra istanza dell'EJB per eseguire lo stesso metodo in istanze diverse, cosa succede se il metodo non è lo stesso? Un'altra istanza verrà creata comunque? – fgonzalez

+0

Viene eseguito a livello di istanza. Il contenitore non consentirà a due thread di inociare contemporaneamente una determinata istanza di bean, qualunque sia il metodo. E in genere non * crea * una nuova istanza. Ne prende uno dalla piscina. –

+0

Cristal chiaro, grazie !! – fgonzalez