Session Beans & Servlet Integration - ralf-gitzel.inforalf-gitzel.info/JEE-14-09-SessionBeans.pdf•...

Post on 12-Aug-2019

240 views 0 download

transcript

Ralf Gitzelralf_gitzel@hotmail.de

1

Session Beans & Servlet Integration

Ralf Gitzelralf_gitzel@hotmail.de

2

Themenübersicht

3

Übersicht

• Motivation• Das Interface• Stateful und Stateless Session Beans• Programmierung einer Stateful Session

Bean mit Local Interface• Web Client

Ralf Gitzelralf_gitzel@hotmail.de

4

Motivation für Session Beans

5

MotivationWeb Container

Servlet/JSF

EJB Container

EntityDB

Per

sist

ence

Pro

vide

r

Session Bean

SichtbarerEinstiegspunktfür das Servlet

6

Mögliche Clients für eine SessionBean

Servlet/JSF

EJB Container

Entity

Session Bean

GUI-basierteJava Anwendung

Web Service

Bel. Anwendung

Session Bean

7

Rolle der Session Beans

• Stellen Geschäftslogik nach außen zurVerfügung

• Der JEE Client (z.B. ein Servlet oder eineManaged Bean) greift über die SessionBeans auf die EJB Applikation zu

• Die Session Beans stellen die „Session“der JEE Anwendung dar

8

Anmerkung: Session Bean vs.Normale Java Klassen im Servlet

• Trennung von Darstellung und Code:– Deployment Logik und Darstellung of verschiedenen

Servern– Mehrere Darstellungsformen für die gleiche Logik

• Enterprise Integration: Logik kann ohne vielAufwand parallel auch als Web Serviceangeboten werden (d.h. Aufruf aus anderenAnwendungen, die in anderen Sprachengeschrieben sind!)

• Containerdienste (Persistenz, Sicherheit,Transaktionen)

9

Session im EJB Kontext

• Session: Eine (virtuelle) Verbindungzwischen dem Client und dem Server,die eine endliche Zeitspanne anhält

• Lange Session: Stateful Session Bean(merkt sich Daten zwischen Aufrufen)

• „Kurze Session“: Stateless SessionBean (jeder Aufruf ist eine neue Session)

Ralf Gitzelralf_gitzel@hotmail.de

10

Das Interface

11

Session Beans

Stateful: Merkt sich denZustand der Bean

Stateless: Zustandslos,jeder Aufruf wie neu

Remote Interface

Local Interface

Session Beans

Entfernter vs. Lokaler Zugriff

EJB Container

Verschiedene Client Typen

12

Client Szenarien

Servlet

Session Bean

Lokaler Zugriff

Servlet

Session Bean

Entfernter Zugriff

Ralf Gitzelralf_gitzel@hotmail.de

13

Stateful und Stateless SessionBeans

14

Session Beans

Stateful: Merkt sich denZustand der Bean

Stateless: Zustandslos,jeder Aufruf wie neu

Remote Interface

Local Interface

Session Beans

Session Länge (lang vs. kurz)

EJB Container

Verschiedene Client Typen

15

Stateless vs. Stateful SessionBeans: Stateless

@Stateless

Session Bean

Client

@Stateless

Session Bean

@Stateless

Session Bean

Jeder Aufruf ist eine neue Session, alle „Daten“ sind vergessen!

16

Stateless vs. Stateful SessionBeans: Stateful

@Stateful

Session Bean

Client

Eine Session, d.h. „Daten“ werden zw. den Aufrufen gespeichert!

17

Stateless Session BeanImplementierung (I)

EJB ContainerSession Bean

Klasse A

Session BeanKlasse B

Session BeanA Objekt 1

Session BeanA Objekt 2

Session BeanA Objekt n

A.doX()

A.doX()

A.doX()

Bea

nP

ool

18

Stateless Session BeanImplementierung (II)

EJB ContainerSession Bean

Klasse A

Session BeanKlasse B

Session BeanA Objekt 1

Session BeanA Objekt 2

Session BeanA Objekt n

Bea

nP

ool

Client bekommt eine zufällige Instanz aus dem Pool zugewiesen!

19

Stateless Session BeanImplementierung (III)

EJB ContainerSession Bean

Klasse A

Session BeanKlasse B

Session BeanA Objekt 1

Session BeanA Objekt 2

Session BeanA Objekt n

Bea

nP

ool

Aufrufe hintereinander könnenbei unterschiedl. Objekten dergleichen Klasse enden!

1. Aufruf

2. Aufruf

20

Gruppendiskussion

• Erklärt diese Implementierung, warumStateless Session Beans keinen Zustandspeichern können?

• Welche Vorteile bietet die Implementierung alsPool?

21

Stateful Session BeanImplementierung (I)

EJB ContainerSession Bean

Klasse A

Session BeanA Objekt für I

A.doX()

A.doX()

Client I

Client II

Session BeanA Objekt für II

1-zu-1 Zuordnung bis zum Ende der Session

22

Passivierung

Aktiv, d.h. im Hauptspeicher

Passiv, d.h. auf derPlatte gespeichert

Keine

Client

Aktivität

Ern

eute

Clie

ntA

ktiv

ität

Hält die Belastung desHauptspeichers durch inaktiveSessions gering.

Timeout: Sehr lange nichtverwendete Sessions werdenganz beendet.

23

Gruppendiskussion

• Was ist der Nachteil, was ist der Vorteilgegenüber einer Stateless SessionBean?

• Warum sind nicht alle Session Beansstateful?

Ralf Gitzelralf_gitzel@hotmail.de

24

Programmierung einer StatefulSession Bean mit Local Interface

25

Interfaces

• Jede Session Bean muss mindestensein Interface haben

• Methodennamen dürfen nicht mit derBuchstabenfolge „ejb“ beginnen

• Ein Interface kann nur eine Annotationhaben, d.h. man muss jedes Interfaceeinzeln definieren

• Local Interface Annotation: @Local

26

Beispiel: Local Interface

Datei: IPersonenQuelle.javaAnm.: Methoden können beliebig sein

27

Session Bean Klasse• Markierung mit Annotation: Stateless oder Stateful• Implementiert Interface(s)• Einschränkungen:

– nicht „abstract“ oder „final“– Methoden dürfen nicht final sein– Keine Methoden, deren Name mit „ejb“ beginnt

• Kann von anderen Klassen erben (auch von anderenSession Bean Klassen)

• Kann auch Methoden enthalten, die nicht im Interfacedefiniert sind

• Muss einen parameterlosen Konstruktor haben

28

Zusätzliche Programmier-Regelnfür Stateful Session Beans

• Speicherung des Zustandes in denInstanzvariablen

• Instanzvariablen müssen serialisierbar sein(wegen möglicher Passivierung)

• Stateful Session Beans müssen mit @Removeexplizit zerstört werden, sonst wirdSpeicherplatz vergeudet!

29

Beispiel: Stateful Session BeanKlasse

Datei: PersonenQuelle.java

Ralf Gitzelralf_gitzel@hotmail.de

30

Web Client

31

Zugriff auf eine Session Bean

• Trivial für Stateless Session Beans (sog.Dependency Injection, s. letzteVorlesung – Hello World)

• Für Stateful Session Beans benötigen wireinen JNDI-Lookup

32

Wie verwende ich die StatefulSession Bean im Servlet?

1. JNDI Lookup

„StartServlet“(erster Aufruf

der Applikation!)

Referenz auf EJB

Andere Servlets

2. Speicherungin Session

Session Attributauslesen

Referenz auf EJB

33

Wie verwende ich die StatefulSession Bean im Servlet?

1. JNDI Lookup

„StartServlet“(erster Aufruf

der Applikation!)

Referenz auf EJB

Andere Servlets

2. Speicherungin Session

Session Attributauslesen

Referenz auf EJB

34

EJB aus Session verwenden

Datei: PersonAnlegenServltAufruf über: StartServlet

35

EJB aus Session verwenden

• Verwendung des Objekts aus der Session wiebisher auch

• Interessante Details:– Wir müssen das Interface als statischen Typ

verwenden– Wir speichern nicht mehr die Daten sondern das

Datenzugriffsobjekt in der Session(PersonenQuelle statt List<Person>)

• Aber: Wie bekommen wir das Objekt in dieSession?

36

Wie verwende ich die StatefulSession Bean im Servlet?

1. JNDI Lookup

„StartServlet“(erster Aufruf

der Applikation!)

Referenz auf EJB

Andere Servlets

2. Speicherungin Session

Session Attributauslesen

Referenz auf EJB

37

EJB Objekt in die Sessionspeichern

Datei: StartServlet.java

Bis auf dieObjekterzeugung

wie gehabt!

38

Wie verwende ich die StatefulSession Bean im Servlet?

1. JNDI Lookup

„StartServlet“(erster Aufruf

der Applikation!)

Referenz auf EJB

Andere Servlets

2. Speicherungin Session

Session Attributauslesen

Referenz auf EJB

39

Konzept des JNDI Aufrufs auseinem Servlet

Bean Informationenkonfigurieren

Context vomContainer holen

Eine Referenz aufdie Bean aus dem

Context holen

Für weitereVerwendung in der

HttpSession ablegen

(Automatisch)Session Bean im

Context anmelden

40

Konzept des JNDI Aufrufs auseinem Servlet

Bean Informationenkonfigurieren

Context vomContainer holen

Eine Referenz aufdie Bean aus dem

Context holen

Für weitereVerwendung in der

HttpSession ablegen

(Automatisch)Session Bean im

Context anmelden

41

EJB Objekt in die Sessionspeichern

Datei: StartServlet.java

1

1

2

2

42

Konzept des JNDI Aufrufs auseinem Servlet

Bean Informationenkonfigurieren

Context vomContainer holen

Eine Referenz aufdie Bean aus dem

Context holen

Für weitereVerwendung in der

HttpSession ablegen

(Automatisch)Session Bean im

Context anmelden

43

Context Zugriff

Datei: StartServlet.javaAnm: Die Befehle könnten auch direkt in doGet/Post stehen…

44

Erläuterung zur vorherigen Folie

• Context-Objekt wird immer auf diese Weiseerzeugt

• Zugriff auf JNDI ist immer gleich, bis auf:– Name des Interfaces (z.B. IPersonenQuelle)– Name der Session Bean (z.B. PersonenQuelle)

• Wichtig: Exceptions abfangen!

Ralf Gitzelralf_gitzel@hotmail.de

45

Lernziele

46

Lernziele

• Stateful vs. Stateless verstehen• Stateful Session Bean programmieren

können• Session Bean im Client verwenden

können• JNDI Lookup nur passiv verwenden (der

Code muss nicht auswendig gekonntwerden)

Ralf Gitzelralf_gitzel@hotmail.de

47

Übungsaufgabe

Übungsaufgabe

• Hinweis: Verwendet keine SessionBeans nur JSF!

• Aufgabe: Programmieren Sie eineWebseite, auf der man verschiedeneKöpfe und Körper kombinieren kann!

48

Screenshot 1

49

Screenshot 2

50

Hinweise zur Bearbeitung

51

Kopfbilder

Körperbilder

Hinweis: Man kann den Bildnamen aus einer Expression und einemString zusammenbauen!Als Lösung nicht akzeptiert ist es, den Bildnamen in der ManagedBeanzusammenzusetzen.

Ralf Gitzelralf_gitzel@hotmail.de

52

Bonusmaterial

53

Remote Interface

• @Remote Annotation• Alle Parameter müssen Serializable sein• Einsatz wird hier nicht vertieft

54

Web Service Interface

• Kann nur für Stateless Session Beansdefiniert werden, da Web Services immerzustandslos sind

• @WebService Annotation, ohneParameter

• Wird hier nicht weiter vertieft

55

Vererbung der Annotationen

• @Stateless und @Stateful werden nichtvererbt

• Life Cycle Annotationen an denMethoden werden vererbt (s. später)

56

Probleme und Antworten• Warum kriege ich eine NullPointerException bei

Verwendung der Dependency Injection (z.B. mit@EJB)?– Verwende ich die richtigen Versionen von EJB (3.0) und

Servlets (2.5)?– Manchmal ist Undeploy/Server-Stop/Server-Start/Deploy keine

schlechte Idee.– Was sagt das Glassfish/JBoss Server Log?– Stateful Session Bean? Dann brauchen wir JNDI und nicht

Injection!• Warum ist alles so langsam?

– Evtl. läuft der Server im Hintergrund und führt für jedeÄnderung ein „Hot Deploy“ durch – Server stoppen!

57

Voller Lebenszyklus der StatefulSession Bean

Nicht existent

Zerstörung

Aktiviert

Passiviert(Auf FestplatteAusgelagert)

Ern

eute

Anf

rageC

lientlängerInaktiv

oder

sehr

lang

ein

aktiv

Sehr lange inaktiv

Neue Anfrage

58

LifeCycleCallBacks (I)

• Wenn man Ressourcen wie JDBC,Messaging usw. verwendet, dann mussman ggf. zu verschiedenen ZeitpunktenRessourcen initialisieren oder freigeben

• Hierzu verwendet man dieLifeCycleCallback Methoden, dieautomatisch aufgerufen werden, wennein bestimmter Zustand erreicht wird

59

LifeCycle Callbacks (II)

• @Remove ist keine Callback Methode!• Callbacks:

– @PostConstruct: Nach der Initialisierung derKlasse. (Z.B. Datenbank öffnen)

– @PreDestroy: Kurz vor der Zerstörung. (Z.B.Datenbank schließen)

– @PrePassivate: Vor der Passivierung einerStateless Session Bean. (Z.B. Datenbanköffnen)

– @PostActivate: Nach der Aktivierung…

60

Gruppendiskussion letzte Stunde:Was ist hier falsch?

61

Antwort zu letzter StundeWeb Container

Servlet

EJB Container

Session Bean(Hello User)

Das war gewollt

Web Container

Servlet

EJB Container

Session Bean(Hello User)

Das passiert tatsächlich

Java Klasse(Hello User)

Ralf Gitzelralf_gitzel@hotmail.de

62

Stateless Session Beans

63

Local Interface der Bean

Die @Local-Annotation

Interface: minimo.help.IPersonTaskMatcher im Projekt SessionBeansEJBClient-Aufruf erfolgt in minimo.servlet.SetupAssignPersonPageHandler

64

Beispiel Stateless Session Bean

Klasse: minimo.help.PersonTaskMatcher im Projekt SessionBeansEJB

Die @Stateless-Annotation(Parameter optional und im

Moment unwichtig)

Implementiert das LocalInterface

65

Client für Session Beans

• Wie besprochen über Dependency Injection(@EJB)

• In Ausnahmefällen JNDI Lookup (s. später)

66

Tipps zur Verwendung vonStateful Session Beans

• Lieber Stateless als Stateful (wenn möglich)• Wegen der Kosten der Passivierung/Aktivierung

und Clustering möglichst wenig Daten in einer StatefulSession Bean speichern (z.B. lieber Lookup-Namenals ganzes Person-Objekt)

• Remove-Methode immer verwenden um „verwaiste“Sessions zu vermeiden

• (Anmerkung: Falls beim Server Passivierungsintervalleeingestellt werden können, kann ein falscher Wertmehr Performanceschaden als –nutzen verursachen)