2012-11-29 21 views
5

Penso di avere qui un problema di comprensione di base e spero che qualcuno possa spiegarmelo.JAVA EE 6 istanze di condivisione tra EJB stateful

consente di dire che abbiamo un EJB_A stateful e un EJB_B stateful e un ManagedbeanA sessionscoped:

@Stateful 
@LocalBean 
public class EJB_A { 
} 

@Stateful 
@LocalBean 
public class EJB_B { 
    @EJB 
    EJB_A ejb; 
} 
@ManagedBean 
@SessionScoped 
public class ManagedBeanA { 
    @EJB 
    EJB_A ejb; 
} 

Nel ManagedBeanA, viene creata l'EJB_A. Ora, quando utilizzo EJB_B, che ha EJB_A come proprietà, viene creata una nuova istanza di EJB_A all'interno di EJB_B. Non è la stessa istanza di EJB_A creata precedentemente in ManagedBeanA.

Non lo capisco, perché ho pensato che l'intero punto degli EJB di stato sia, che per ogni cliente solo una istanza sia creata e condivisa e gestita dal bean EJB. Qualcuno può spiegarmelo per favore? E per favore spiega anche come posso ottenere che la stessa istanza di un EJB sia condivisa da più EJB diversi?

Grazie

+0

Quando si dice " Ora quando uso EJB_B "cosa intendi con questo? Come hai verificato che non si tratti della stessa istanza? –

+0

Quando instianciate EJB_B e guardo le proprietà (ad esempio una proprietà stringa) di EJB_A, le proprietà del bean EJB_A sono diverse dalle proprietà dell'EJB_A che è stata instanciata dal bean gestito. – user1727072

+0

Dove si "instanciate" EJB_B; all'interno di un altro ManagedBean o di un client Java (ricerca remota)? –

risposta

9

Sì, è mischiato concetti diversi, e diversi APIS troppo ... Preferisco utilizzare @Inject sopra @EJB e specificare l'ambito dell'istanza iniettato ..

@Stateful 
@LocalBean 
public class EJB_A { 
} 

@Stateful 
@LocalBean 
public class EJB_B { 
    @Inject @SessionScoped 
    EJB_A ejb; 
} 
@ManagedBean 
@SessionScoped 
public class ManagedBeanA { 
    @Inject @SessionScoped 
    EJB_A ejb; 
} 
+0

puoi spiegare perché dovrei usare @Inject invece di @EJB? – user1727072

+1

Bene, una discussione approfondita sull'argomento è: [link] http://www.seamframework.org/107780.lace Fondamentalmente il fattore discriminante è che '@ Inject' è sempre a conoscenza dell'ambito di applicazione del oggetto iniettato e che si è certi che l'istanza iniettata sia gestita (evitando così problemi di serializzazione dei bean remoti). Usando '@ Inject' ottieni un Oggetto Gestito (a volte con proxy), usando' @ EJB' ottieni una Risorsa, non molto diversa da una semplice ricerca JNDI –

+0

grazie che clearifies molto per me :)! – user1727072

1

Credo confuso due cose - @SessionScoped e @Stateful.

L'annotazione @Stateful non significa che viene creata solo un'istanza per client. Significa semplicemente che @ Stateful-EJB appartiene a UN solo client, mentre un @ Stateless-EJB può essere condiviso da più client.

Quindi un @ Stateful-EJB ha una relazione N: 1 (gli EJB N @ Stateful appartengono a un solo client) e un @ EJB stateless ha una relazione N: M (N @ Stateless-EJBS appartiene ai client M). Ciò significa che un'istanza EJB non può essere condivisa da più EJB utilizzando semplicemente @ EJB-Annotation per gli EJB @Stateful.

Sembra che @ Sessionscoped-Managedbean sia creato solo una volta per client.

Ho capito bene?

2

Ho appena letto un po 'here.

La ragione è che ogni ricerca() di un EJB 3.0 stateful session bean risultati di interfaccia affari remota o locale per la creazione di una nuova identità di fagioli . Ogni riferimento restituito dalla ricerca fa riferimento a un bean di sessione con stato differente . Spetta al chiamante determinare come vuole gestire l'accesso a tale riferimento. In genere un'applicazione web memorizzerà il riferimento in un HttpSession o nell'ambito a livello di applicazione (ServletContext) per l'accesso successivo.

E:

Non dimenticate nel tuo caso abbiamo a che fare con 2 tipi di sessioni: la sessione di fagioli e la sessione web. Il primo garantisce che una volta che si richiede un bean con stato , l'identità rimane la stessa attraverso quella sessione utente . Ma quando si utilizza quest'ultimo, si ha una sessione Web su parte superiore della sessione del bean. Per garantire l'accesso allo stesso bean da 2 JSP diversi (o quando si esegue una ricarica), è necessario memorizzare l'identità del bean nell'ambito della sessione Web.

Quindi hai ragione.Quando si desidera utilizzare l'istanza, è necessario utilizzare ManagedBean per recuperarlo da qualche altra parte, poiché l'istanza EJB è associata a questo contesto di sessione. Pertanto, se si desidera semplificarlo e accertarsi che l'EJB esista appena una volta per sessione, utilizzare CDI e annotare il bean stesso con @javax.enterprise.context.SessionScoped; di quanto tu possa essere sicuro.

+0

grazie mille utili! – user1727072

Problemi correlati