Session-Bean-Details
Themenübersicht "Session-Bean-Details"




               Allgemeines zu Session-Beans
               Konversationen
               Implementationsdetails
               Session-Context
               Stateless- und Stateful-Lebenszyklus
               Lebenszyklus-Callbacks
               Das ungeliebte Home-Interface
               Optimierungsstrategien
               Voraussetzungen für die Passivierung



Präsentation "Enterprise Java Beans 3.1"           © Oliver P. Schell 2011   www.schellsoft.de   39
Allgemeines zu Session-Beans




               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


Präsentation "Enterprise Java Beans 3.1"          © Oliver P. Schell 2011      www.schellsoft.de   40
Konversationen



               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




Präsentation "Enterprise Java Beans 3.1"         © Oliver P. Schell 2011      www.schellsoft.de   41
Implementationsdetails


               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 @Local
                     public 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() {
                        …
                      }


Präsentation "Enterprise Java Beans 3.1"         © Oliver P. Schell 2011      www.schellsoft.de       42
Implementationsdetails




               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, …




Präsentation "Enterprise Java Beans 3.1"                © Oliver P. Schell 2011    www.schellsoft.de   43
Session-Context



               Session-Context = Schnittstelle zum Application-Server:
                • Bei Stateful- & Stateless-Session-Beans vorhanden:
                   • @Resource
                      private 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()



Präsentation "Enterprise Java Beans 3.1"            © Oliver P. Schell 2011   www.schellsoft.de   44
Session-Context




               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()




Präsentation "Enterprise Java Beans 3.1"           © Oliver P. Schell 2011    www.schellsoft.de   45
Stateless- und Stateful-Lebenszyklus




Präsentation "Enterprise Java Beans 3.1"         © Oliver P. Schell 2011   www.schellsoft.de   46
Lebenszyklus-Callbacks



               Callback zur Initialisierung:
                • Reagiert auf Erzeugung durch den Client:
                   • @PostCreate
                      public 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:
                   • @PostActivate
                      public void myPostActivateMethod() { … }

               Callback zur Zerstörung:
                • Reagiert auf Löschung durch den Client oder auf System-Exceptions:
                   • @PreDestroy
                      public void myPreDestroyMethod() { … }
                • Wird bei der Löschung passivierter Stateful-Beans nicht berücksichtigt!

Präsentation "Enterprise Java Beans 3.1"            © Oliver P. Schell 2011      www.schellsoft.de   47
Das ungeliebte Home-Interface



               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 ) { … }
                        …
                      }



Präsentation "Enterprise Java Beans 3.1"         © Oliver P. Schell 2011      www.schellsoft.de   48
Optimierungsstrategien




               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




Präsentation "Enterprise Java Beans 3.1"                 © Oliver P. Schell 2011     www.schellsoft.de   49
Voraussetzungen für die Passivierung


               Der Container serialisiert den Conversional State in einen Cache:
                • Die EJB wird darüber per Callback informiert:
                   • @PrePassivate
                     public 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;
                      }

Präsentation "Enterprise Java Beans 3.1"             © Oliver P. Schell 2011   www.schellsoft.de      50

Auszug Seminarmaterial "EJB 3.x"

  • 1.
  • 2.
    Themenübersicht "Session-Bean-Details" Allgemeines zu Session-Beans Konversationen Implementationsdetails Session-Context Stateless- und Stateful-Lebenszyklus Lebenszyklus-Callbacks Das ungeliebte Home-Interface Optimierungsstrategien Voraussetzungen für die Passivierung Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 39
  • 3.
    Allgemeines zu Session-Beans 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 Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 40
  • 4.
    Konversationen 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 Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 41
  • 5.
    Implementationsdetails 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 @Local public 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() { … } Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 42
  • 6.
    Implementationsdetails 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, … Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 43
  • 7.
    Session-Context Session-Context = Schnittstelle zum Application-Server: • Bei Stateful- & Stateless-Session-Beans vorhanden: • @Resource private 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() Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 44
  • 8.
    Session-Context 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() Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 45
  • 9.
    Stateless- und Stateful-Lebenszyklus Präsentation"Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 46
  • 10.
    Lebenszyklus-Callbacks Callback zur Initialisierung: • Reagiert auf Erzeugung durch den Client: • @PostCreate public 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: • @PostActivate public void myPostActivateMethod() { … } Callback zur Zerstörung: • Reagiert auf Löschung durch den Client oder auf System-Exceptions: • @PreDestroy public void myPreDestroyMethod() { … } • Wird bei der Löschung passivierter Stateful-Beans nicht berücksichtigt! Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 47
  • 11.
    Das ungeliebte Home-Interface 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 ) { … } … } Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 48
  • 12.
    Optimierungsstrategien 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 Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 49
  • 13.
    Voraussetzungen für diePassivierung Der Container serialisiert den Conversional State in einen Cache: • Die EJB wird darüber per Callback informiert: • @PrePassivate public 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; } Präsentation "Enterprise Java Beans 3.1" © Oliver P. Schell 2011 www.schellsoft.de 50