
e2cf99de46141e02695dacd4c1ebcf6c.ppt
- Количество слайдов: 51
Realisierung verteilter Anwendungen: Teil 6 Ralf Möller, FH-Wedel z Beim vorigen Mal: y. Einführung in Multitier-Architekturen y. Dynamische Seitengenerierung (JSP und Servlets) z Inhalt heute y. Komponentenarchitekturen (am Beispiel von Enterprise Java Beans) z Lernziel: y. Grundverständnis des Designs der EJB-Architektur zur weiteren Vertiefung im Beruf
Enterprise Java Beans (EJB) Teile von einigen der nachfolgenden Folien wurden übernommen aus: VL Anwendungssysteme Gerald Weber
Ziele der EJB-Architektur z Standard-Applikationsserver-Architektur für Java z Abstraktion von Low-Level Aufgaben bei Transaktionen, Multithreading, Connection Pooling z Komponenten-Orientierung: Applikationen können aus Teilen verschiedener Hersteller aufgebaut werden z Definierte Rollenverteilung für die Systemerstellung z Definition der Aufgaben der Rollen durch Contracts
EJB-Architektur EJB-Server RMI Clients RDBMS B JDBC Containe r B CORBA Legacy. Application
Beispiel: E-Commerce-System z Bean-Provider Cat. com bietet Produktkatalog My. Cat an . jar z App. Assembler Web. Vend erstellt Applikation Buy. Me z Marktplatz Good. Stuff ist Deployer, EJBServer und Container kommen von Mega. Beans JSP Client HTTP My. Cat Cart. jar Order DD EJB Serv. + Cont. M. C. O. DD = Deployment Descriptor
JMS (Java Message Service) JNDI (Java Naming and Directory Interface)
EJB Rollen z Bean Provider (Experte im Anwendungsbereich) z Application Assembler: (Experte im Anwendungsbereich) z Deployer (Experte für spezielle Systemumgebung) z EJB Server Experte (TP-Experte, z. B. DB-Anbieter) z EJB Container Provider (Experte für Systemprogrammierung, Load Balancing) z System-Administrator
Welche Analyse-Klassen stellen EJBs dar? z EJBs repräsentieren grobkörnige Objekte: y. Sitzungsobjekte: Session Beans x. Stateless: single-use service, haben keinen Zustand x. Stateful: speichern Zustand, aber nur transient y. Persistente Objekte: Entity Beans z Beispiel: Eirichtung einer Bean für eine Rechnung, aber nicht für einen Rechnungsposten
Komponentenbegriff z Beans implementieren Business-Logik. z Beans sind verteilte Objekte. z Bean ist über eine Anzahl von Parametern anpaßbar. z Beans enthalten deklarative Informationen über den Einsatzkontext (Deployment-Descriptor). z Client-Zugriff erfolgt durch festgelegte Interfaces
Java-Sprachebene: Elemente einer EJBean z Home Interface: Feste Arten von Klassen-Methoden. U. a. Life -cycle-Management Methoden (Erzeugung. . . ) z Remote Interface: Instanzmethoden, Business. Methoden z Beanklasse: Implementiert beide Interfaces z Deployment Descriptor z Verwendete andere Klassen (Helper Classes) Home Remote Bea n Helper
Beispiel: Die Entity. Bean My. Cat z Home-Interface My. Cat. Home: y create(String Name) y find. By. Primary. Key(String) y find. Like(String keyword) z Remote-Interface My. Cat: y get. Price() etc. y set. Price() etc. y buy(int pieces) z Bean-Klasse My. Cat. Bean: Implementiert Methoden aus My. Cat. Home und My. Cat. z Deployment Descriptor: y type: entity y role admin: Alle Methoden y role customer: nicht set. Price().
Locating a (session) Bean’s home interface z JNDI (Java Naming and Directory Interface) Context initial. Context = new Initial. Context(); Bank. Bean. Home my. Bean. Home = (Bank. Bean. Home) initial. Context. lookup("Systems/gsj 21/Repository/Applicat ions/Bank. Example 1/Homes/Bank. Session. Bean");
EJB Contracts: Client-View-Contract z Client kann durch RMI auf Bean zugreifen. z Pro Deployment einer Bean ist ein Home. Interface-Objekt in JNDI eingetragen und für den Client nutzbar. z Bean Instanzen implementieren das Remote. Interface Der Client erhält sie durch das Home. Interface.
Component Contract z Beans werden in Container eingebettet z Bean implementiert Business-M. , Life-cycle-M. u. a. Callbacks. Container ruft diese sinngemäß auf z Container behandelt z. B. Transaktionen, Security und Exceptions z Container bietet JNDI-Environment, EJBContext z Bean Provider vermeidet Programmierung, die das Container Runtime Management stört z Optional: Container behandelt Persistenz z Deployment-Descriptor enthält entsp. Daten
Motivation der J 2 EE-Umgebungseinbettung z Beispiel: Verbindungen (connections) z Verbindungsobjekte repräsentieren eine Zugriffsmöglichkeit auf eine Ressource (z. B. JDBC)
Nachteile des häufigen Verbindungsaufbaus z Auf- und Abbau einer Verbindung ist aufwendig z Bei häufigem Zugriff entsteht großer Overhead z Häufig gilt: mehrere Komponenten greifen auf die gleiche Ressource zu z Wünschenswert: Pool von Verbindungen für mehrere Komponenten jeweils für eine Ressource
Beispiel: JDBC-Verbindungen z Connection con; z Result. Set results; z try { con = Driver. Manager. get. Connection( "jdbc: odbc: //vodka. fh-wedel. de/Db", username, password); results = con. create. Statement(). execute. Query(". . . ") z } catch (Exception e) { System. out. println(e); } z con. close();
Kontextabhängigkeit des DB-Treibers z try { Class. for. Name("org. gjt. mm. mysql. Driver") } catch (Class. Not. Found. Exception cnfe) { System. out. println("Cannot load driver"); } z Aber: der Treiber hängt von der Umgebung ab! z Bei Einhaltung des Komponentengedankens muß der Treibername zur Laufzeit erfragt werden! z Hierzu dient ein Kontextobjekt (sog. EJB-Kontext)
Verbindungen im EJB-Kontext (ohne Pool) import java. sql. *; import javax. sql. *; public class Account. Bean implements Entity. Bean { public Collection ejb. Find. By. Last. Name(String l. Name) { try { String dbdriver = new Initial. Context(). lookup("java: comp/env/DBDRIVER"). to. String(); Class. for. Name(dbdriver). new. Instance(); Connection conn = Driver. Manager. get. Connection("java: comp/env/DBURL", "user. ID", "password");
Reduzierung des Aufwandes z Im Applikationsserver laufen viele EJBs z Jede EJB führt kurze Interaktion mit DB durch. . . z. . . und meldet die Verbindung gleich wieder ab z Idee: Teilung von Verbindungen zwischen mehreren EJBs und mehreren Aufrufen von EJB-Methoden z Notwendig: Verwaltung eines kritischen Abschnitt (bedingt durch Multithreading) und ggf. Transaktionsmanagement z Soll das jeder EJB-Programmierer selbst machen?
Connection Pooling durch Container z Idee: Connection Pooling wird durch Umgebung (container) für alls EJBs übernommen
Verbindungen im EJB-Context (mit Pool) (1) import java. sql. *; import javax. sql. *; // import here vendor-specific JDBC drivers public Product. PK ejb. Create() { try { // initialize JNDI lookup parameters Context ctx = new Initial. Context(. . . ); . . . // Following params could come from a JNDI look-up Connection. Pool. Data. Source cpds = (Connection. Pool. Data. Source)ctx. lookup(cpsource);
Verbindungen im EJB-Context (mit Pool) (2). . . cpds. set. Database. Name("PTDB"); cpds. set. User. IF("XYZ"); Pooled. Connection pc = cpds. get. Pooled. Connection(); Connection conn = pc. get. Connection(); // do business logic conn. close(); }. . . }
Zusammenfassung der Motivation für J 2 EE z Es gibt Aspekte der Anwendungsprogrammierung, die für alle Softwarekomponenten relevant sind z Es ist sinnvoll, sie nur einmal zu programmieren und von für verschiedene Komponenten zu nutzen z Es gibt bestimmte Abhängigkeiten der Komponenten vom konkreten Einsatzkontext
Eine Beispielanwendung z Benutzer macht Eingaben in HTML-Formular z Das ausgefüllte Formular wird durch ein Servlet verarbeitet z Das Servlet lokalisiert die Verarbeitungskomponente (Session Bean) über JNDI (Java Naming and Directory Service) z Session Bean macht Berechnung z Servlet kommuniziert Ergebnis zum Benutzer
J 2 EE Software und Setup z Java 2 SDK Enterprise Edition (J 2 EE), Version 1. 2. 1 (http: //java. sun. com/j 2 ee/download. html) z Java 2 SDK, Standard Edition (J 2 SE) Version 1. 2 oder neuer (http: //java. sun. com/jdk/index. html). z Annahme: installiert in $HOME/J 2 EE/j 2 sdkee 1. 2. 1 z bzw. $HOME/J 2 EE/jdk 1. 2. 2 z PATH: $HOME/J 2 EE/jdk 1. 2. 2/bin und $HOME/J 2 EE/j 2 sdkee 1. 2. 1/bin z CLASSPATH: $HOME/J 2 EE/j 2 sdkee 1. 2. 1/lib/j 2 ee. jar
J 2 EE Application Components z Application client components z Enterprise Java. Beans components z Servlets and Java. Server Pages components (auch Web components genannts) z Applets
J 2 EE Application Components z Servlet mit HTML-Dateien werden zu einem Web Archive (WAR) zusammengefaßt z Session Bean und Klassen zu einem JAR Archiv zusammengefaßt z Enterprise Archive (EAR) Datei zur Verifikation, zum Testen und zum Deployment in die Produktionsumgebung enthält alle Teil-Archive
Erzeugen der HTML-Seite bonus. html
" src="https://present5.com/presentation/e2cf99de46141e02695dacd4c1ebcf6c/image-30.jpg" alt="Der HTML-Code in. . . /J 2 EE/Client. Code
Bonus Calculation
Das Servlet z Retrieves the user data z Looks up the session bean z Passes the data to the session bean z Upon receiving a value back from the session bean, creates an HTML page to display the returned value to the user z Datei in. . . /J 2 EE/Client. Code/Bonus. Servlet. java
Initialisierungsmethode für Servlet public class Bonus. Servlet extends Http. Servlet { Calc. Home homecalc; public void init(Servlet. Config config) throws Servlet. Exception{ //Look up home interface try{ Initial. Context ctx = new Initial. Context(); Object objref = ctx. lookup("calcs"); homecalc = (Calc. Home)Portable. Remote. Object. narrow (objref, Calc. Home. class); . . . }}
do. Get Methode z Eingabe: request und response Objekt z Requests repräsentieren die Eingabe vom Browser z Responses repräsentieren einen Ausgabekanal zum Browser z Aufgaben: y. Finden des Home-Interfaces des Anwendungsobjekts y. Aufruf der Methode calc. Bonus y. Generieren des Antwort-HTML-Seite
do. Get Methode (Ausschnitt) public void do. Get (Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { String socsec = null; int multiplier = 0; double calc = 0. 0; Print. Writer out; response. set. Content. Type("text/html"); String title = "EJB Example"; out = response. get. Writer(); out. println("
do. Get Methode (Ausschnitt) try{ Calc the. Calculation; //Retrieve Bonus and Social Security Information String str. Mult = request. get. Parameter("MULTIPLIER"); Integer integer. Mult = new Integer(str. Mult); multiplier = integer. Mult. int. Value(); socsec = request. get. Parameter("SOCSEC"); //Calculate bonus double bonus = 100. 00; the. Calculation = homecalc. create(); calc = the. Calculation. calc. Bonus(multiplier, bonus); } catch(Exception Create. Exception){ Create. Exception. print. Stack. Trace(); }
Bonus Calculation"); out. println("
Soc Sec:" src="https://present5.com/presentation/e2cf99de46141e02695dacd4c1ebcf6c/image-36.jpg" alt="do. Get Methode (Ausschnitt) //Display Data out. println("
Soc Sec:" />
do. Get Methode (Ausschnitt) //Display Data out. println("
Soc Sec: " + socsec); out. println("
Multiplier: " + multiplier); out. println("
Bonus Amount: " + calc); out. println(""); out. close(); }
Erstellung der Session Bean z Zustandlose Bean reicht aus z Calc. Bean. java z Calc. Home. java z in. . . /J 2 EE/Beans
Calc. Home package Beans; import java. rmi. Remote. Exception; import javax. ejb. Create. Exception; import javax. ejb. EJBHome; public interface Calc. Home extends EJBHome { Calc create() throws Create. Exception, Remote. Exception; }
Calc Remote Interface package Beans; import javax. ejb. EJBObject; import java. rmi. Remote. Exception; public interface Calc extends EJBObject { public double calc. Bonus(int multiplier, double bonus) throws Remote. Exception; }
Calc. Bean (Ausschnitt) public class Calc. Bean implements Session. Bean { public double calc. Bonus(int multiplier, double bonus) { double calc = (multiplier*bonus); return calc; } public void ejb. Create() { } public void set. Session. Context(Session. Context ctx) { } public void ejb. Remove() { } public void ejb. Activate() { } public void ejb. Passivate() { } public void ejb. Load() { } public void ejb. Store() { } }
Übersetzung von Session Bean und Servel #!/bin/sh cd. . . /J 2 EE_HOME=. . . /J 2 EE/j 2 sdkee 1. 2. 1 CPATH=. : $J 2 EE_HOME/lib/j 2 ee. jar javac -d. -classpath "$CPATH" Beans/Calc. Bean. java Beans/Calc. Home. java Beans/Calc. java cd. . . /J 2 EE/Client. Code J 2 EE_HOME=. . . /J 2 EE/j 2 sdkee 1. 2. 1 CPATH=. : $J 2 EE_HOME/lib/j 2 ee. jar: /home/monicap/J 2 EE javac -d. -classpath "$CPATH" Bonus. Servlet. java
Starten des Applikationsservers z j 2 sdkee 1. 2. 1/bin/j 2 ee -verbose . . . und des Deploy-Tools z deploytool y. Fenster für J 2 EE Applications und Komponenten y. Inspektorfenster für Information über ausgewählte Applikation oder Komponenten y. Server-Informationsfenster für installierte Applikationen
Deploy-Tool
Zusammenbau der Applikation z Erzeugen eines J 2 EE-Applikation (Bonus. App. ear). z Erzeugen einer Enterprise Bean (Calc. Bean. jar). z Erzeugen einer Web Komponente (Bonus. war). z Angabe eines JNDI Names für die Enterprise bean (calcs). z Angabe eines sog. Root Context für die J 2 EEApplikation (Bonus. Root).
Enterprise Bean
Web Komponente
JNDI-Eintrag und Root Context
Verifikation und Deployment der Applikation
Start der Applikation z Annahme : Web-Server verwendet Port 8000 (ggf. Konfigurierung in. . . /J 2 EE/j 2 sdkee 1. 2/config) z Eingabe der URL http: //localhost: 8000/Bonus. Root/bonus. html in einem Brower z Ausgabe erfolgt in neuer HTML-Seite Bonus Calculation Soc Sec: 77777 Multiplier: 25 Bonus Amount 2500. 0
Diskussion z Die EJB-Architektur befindet sich zur Zeit in der Entwicklung z Es wurde in dieser Vorlesung ein grober Eindruck der Ziele und wesentlichen Ideen vermittelt, und. . . z es wurden die grundlegenden Entwicklungsschritte für einer N-Tier-Anwendung erläutert
Und beim nächsten Mal: z Transaktionsmanagement z Security z Persistenz z und eventuell etwas über Lastverteilung (load balancing)