Upload
schellsoft
View
3.214
Download
1
Tags:
Embed Size (px)
Citation preview
Session-Bean-Details
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Themenübersicht "Session-Bean-Details"
39
Allgemeines zu Session-Beans
Konversationen
Implementationsdetails
Session-Context
Stateless- und Stateful-Lebenszyklus
Lebenszyklus-Callbacks
Das ungeliebte Home-Interface
Optimierungsstrategien
Voraussetzungen für die Passivierung
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Allgemeines zu Session-Beans
40
Session-Bean = netzwerkfähiges Dienstobjekt:• Bietet Remote-Clients Anwendungslogik aller Art an
Stateless-Variante:• Enthalten keine transienten (Sitzungs-)daten (nonconversational)• Gehören Client für die Dauer seines Methodenaufrufs• Müssen nicht rekursiv serialisierbar sein
Stateful-Variante:• Enthalten Sitzungsdaten (conversational state)• Gehören Client für die Dauer einer Sitzung• Müssen rekursiv serialisierbar sein
Gemeinsamkeit beider Varianten:• Unterstützen verteilte JTA-Transaktionen• Besitzen SessionContext-Information
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Konversationen
41
Conversional State = Stateful-Bean speichert exklusiv Daten eines Clients (Sitzung):• Z.B. Attributwerte, Datenbankverbindungen, Referenzen auf EJBs, etc.
Nachteile durch den Conversational State:• EJB-Instanzen nehmen stetig zu• Performancesteigerung wird notwendig
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Implementationsdetails
42
Vererbungsdetails:• Implementationsklasse erbt ihr Remote- und/oder Local-Interface
Annotierungen:• Festlegung des Konversationstyps auf Klassenebene:•@Stateless // ODER @Stateful public class DemoBean implements Demo { … }
• Festlegung des Remote-Interfaces:•@Remote // ODER @Localpublic interface Demo { … }
•@Remote( Demo.class )public class DemoBean implements Demo, Interface2, Interface3 { … }
Erzeugung einer Instanz:• Instanzen werden pro JNDI-Lookup geliefert:•Demo beanStub = (Demo) ctx.lookup( "/DemoBean/remote" );
Löschung einer Stateful-Instanz:• Geschieht über beliebig viele mit @Remove annotierte Methoden in der Bean-Klasse!•@Remove( retainIfException = true ) public void checkout() { …}
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Implementationsdetails
43
Alle Deployment-Descriptor-relevanten Details sind annotierbar:• Deklaration von Transaktionsdetails (s. Transaktionen):•@TransactionManagement, @TransactionAttribute, …
• Deklaration von Berechtigungen (s. Security):•@RolesAllowed , @PermitAll, @RunAs, …
• Aktivierung von Injections (s. JNDI-Dienst):•@Resource, @EJB, @PersistenceContext, …
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Session-Context
44
Session-Context = Schnittstelle zum Application-Server:• Bei Stateful- & Stateless-Session-Beans vorhanden:•@Resourceprivate SessionContext context;
• Inhalte ändern sich jeweils beim Wechsel des Bean-Clients
Features des Session-Context:• Identität des Clients (Rechte, etc.):•public Principal getCallerPrincipal()
•public boolean isCallerInRole( Identity role )
• Referenz auf das Home-Objekt:•public EJBHome getEJBHome()
• Referenz auf das EJBObject:•public EJBObject getEJBObject()
• Referenz auf den aktiven Transaktionskontext:•public UserTransaction getUserTransaction()
•public void setRollbackOnly()
•public boolean getRollbackOnly()
• Zugriff auf den Timer-Service:•public TimerService getTimerService()
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Session-Context
45
Neue EJB-3-Features des Session-Context:• Zugriff auf die EJB-Umgebung:•public Object lookup( String name )
• Liefert Handle auf die EJB:(z.B. zur Übergabe an den Client)•public getBusinessObject( Class businessInterface )
• Liefert das Interface, über dass gerade operiert wird:•public Object getInvokedBusinessInterface()
• Liefert Zugriff auf den JAX-RPC-Kontext, falls vorhanden:•public MessageContext getMessageContext()
Deprecated in EJB 3.0:• Folgende Methoden liefern nun eine Exception:•public Object getEJBObject()
•public Object getEJBLocalObject()
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Stateless- und Stateful-Lebenszyklus
46
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Lebenszyklus-Callbacks
47
Callback zur Initialisierung:• Reagiert auf Erzeugung durch den Client:•@PostCreatepublic void myPostCreateMethod() { … }
Callback zur Passivierung:• Serialisiert Stateful-Beans nach definiertem Timeout:•@PrePassivate public void myPostPassivateMethod() { … }
Callback zur Aktivierung:• Reaktiviert für zuvor serialisierte Stateful-Beans:•@PostActivatepublic void myPostActivateMethod() { … }
Callback zur Zerstörung:• Reagiert auf Löschung durch den Client oder auf System-Exceptions:•@PreDestroypublic void myPreDestroyMethod() { … }
• Wird bei der Löschung passivierter Stateful-Beans nicht berücksichtigt!
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Das ungeliebte Home-Interface
48
Home-Interfaces sind deprecated, werden aber weiter unterstützt:• Home-Interfaces erzeugen oder verwerfen EJB-Instanzen• Sie werden weiterhin in Remote- und Local-Varianten unterschieden
Explizites Coding des Home-Interface:• Aufbau des Interfaces:•public interface DemoHome extends javax.ejb.EJBHome { public Demo create() // ruft startBean() throws CreateException, RemoteException; public Demo create( String greeting ) // ruft startBean( String ) throws CreateException, RemoteException;}
• Verweis aus der Implementationsklasse:•@RemoteHome( DemoHome.class ) // ODER @LocalHome( … )public class DemoBean implements Calculator { … @Init public void startBean() { … } @Init public void startBean( String greeting ) { … } …}
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Optimierungsstrategien
49
Verfahren der "Passivierung" bei Stateful-Session-Beans:• Deaktivierung (Caching) der EJB-Instanz nach Timeout• EJB-Client-Assoziation existiert weiterhin• Löschung der EJB-Instanz nach weiterem Timeout
Verfahren des "Pooling" bei Stateless-Session-Beans:• Container bereitet EJB-Instanzen vor und hält sie im Pool vorrätig
Timeout = Zeit bis zu einem Stateful-EJB-Zustandswechsel:• Max-Age: Zeit bis zur Passivierung• Max-Life: Zeit bis zur Entfernung aus dem passiven Zustand
Meist werden Timeouts von Tasks bzw. Threads kontrolliert:• Overager: Prüft auf passivierbare EJBs• Remover: Prüft auf löschbare EJBs
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Enterprise Java Beans 3.1"
Voraussetzungen für die Passivierung
50
Der Container serialisiert den Conversional State in einen Cache:• Die EJB wird darüber per Callback informiert: •@PrePassivatepublic void beanWillPassivate() { … }
•@PostActivate public void beanWasActivated() { … }
Risiko beim Serialisierungsvorgang:• Eine "java.io.NotSerializableException" könnte entstehen!
Serialisierbare Bean-Attribute:• Serialisierbares Objekt• Referenz auf NULL• Remote-Interface, Home-Interface, Local-Interface, Local-Home-Interface, SessionContext,
JNDI-Namensdienst, UserTransaction, Resource-Factory
Varianten, falls ein Attribut nicht serialisierbar ist:A) Attribut-Deklaration mit "transient":•transient private ResultSet results;
B) In @PrePassivate-Methode referenz auf NULL setzen:•public void beanWillPassivate() { this.results.close(); this.results = null;}