EJB stateful nell’applicazione Web?

Non ho mai usato EJB stateful. Comprendo che un EJB con stato può essere utile con un client java.

Ma mi chiedo: in tal caso usarli su un’applicazione web? E come? Dovremmo mettere questi bean stateful in Session (a causa di http stateless)?

È una buona pratica? (senza discutere troppo su statico vs apolide)

Abbastanza divertente, è una seconda domanda su SFSB e app web per il giorno, mentre questo argomento non è solitamente così comune.

in tal caso usarli su un’applicazione web?

L’esempio tradizionale di SFSB e l’app Web è il carrello. Ma allo stesso tempo, puoi fare lo stesso con HttpSession .

Idealmente, se lo stato si riferisce alla logica aziendale e non alla logica di presentazione, dovrebbe andare in un SFSB. Ma in pratica, la gente di solito difende SFSB (a causa della complessità che introduce) a meno che non fornisca qualcosa che non puoi fare facilmente con HttpSession . Nella maggior parte dei casi, è ansible modificare il progetto per archiviare le informazioni in HttpSession o nel database e trasferirle, senza la necessità di disporre di SFSB. Ma alla fine è una questione di purezza del design .

E come? Dovremmo mettere questi bean stateful in Session (a causa di http stateless)?

Il modello EJB è un modello più ricco rispetto a HttpSession , poiché EJB sono componenti transazionali e sono presenti richiami espliciti per la passivazione e l’triggerszione di SFSB. Ciò comporta una maggiore complessità su come utilizzare SFSB correttamente, in particolare (1) gestione delle eccezioni e (2) concorrenza e (2) rimozione e timeout di SFSB. Vedi le mie risposte qui per maggiori dettagli:

  • Java: monitoraggio di una sessione di accesso utente: Session EJBs vs HTTPSession
  • Uso corretto di Stateful Beans con servlet

Se si desidera utilizzarli, è necessario prima cercare l’SFSB per ottenere un riferimento a una nuova istanza remota. Quindi dovrai memorizzare questo riferimento da qualche parte in un modo per riutilizzarlo attraverso le richieste. Questo da qualche parte è solitamente HttpSession , il che significa che anche se si utilizza SFSB, non è ansible eliminarlo completamente.

Con EJB2, il riferimento remoto, chiamato handle , può essere serializzato per essere riutilizzato in seguito. È stato quindi ansible archiviarlo se ad esempio nel database, anche se non l’ho mai visto. Non so se è ancora ansible con EJB3.

È una buona pratica?

Come ho già detto, la gente di solito si pronuncia contro di esso a meno che tu non sappia esattamente perché li HttpSession piuttosto che HttpSession e solo se hai una buona padronanza del modello EJB. (SFSB potrebbe essere giustificato, ad esempio, se il servizio aziendale è accessibile attraverso un front-end Web e un client desktop) Molti altri framework non hanno qualcosa di simile a SFSB e le persone riescono ancora a creare app di qualità con loro.

PS: ho usato SFSB in un’app Web e può effettivamente essere più complicato da usare rispetto a HttpSession , ma alla fine ha funzionato.