Parallelamente al modulo web ho continuato a sviluppare il modulo ejb. Ho deciso di utilizzare dei Session Beans stateless per eseguire azioni atomiche (sulle entità o semplicemente per elaborare alcuni dati). Invece ho preferito utilizzare un Session Bean stateful che fungesse da carrello per l'utente. Fin dal primo istante mi sono accorta che richiamando queste due righe di codice ad ogni reload della pagina mi veniva assegnata ogni volta una nuova istanza dell'EJB.
Context context = new InitialContext();
this.carrelloEJB = (CarrelloSBRemote) context.lookup("WiiShop/CarrelloSB/remote");
Il mio scopo, però, era mantenere un riferimento sempre allo stesso EJB stateful, contenente lo stato del carrello. Allora, dopo molte ricerche, ho scoperto che bastava memorizzare in sessione un reference all'EJB per richiamarlo in caso di bisogno.
this.carrelloEJB = (CarrelloSBRemote) session.getAttribute("shopSFSB");
// se in sessione non c'è un'istanza dell'EJB allora accedo all'EJB e memorizzo un reference nella sessione
if (this.carrelloEJB == null)
{
Context context;
try {
context = new InitialContext();
this.carrelloEJB = (CarrelloSBRemote) context.lookup("WiiShop/CarrelloSB/remote");
session.setAttribute("shopSFSB", this.carrelloEJB);
} catch (NamingException ex) {
}
}
Se, invece che stateful, CarrelloSBRemote fosse stato stateless e avessi utilizzato la stessa tecnica, avrei sbagliato. Testando il codice potreste avere la sensazione che tutto funzioni, ma un stateless Session Bean può essere cancellato in qualunque istante dal sistema e se voi vi salvate un riferimento ad esso non è detto che quando andate a richiamarlo sia lo stesso di prima.
Nessun commento:
Posta un commento