Gliederung Kapitel 3 Java-Komponenten

Transcription

Gliederung Kapitel 3 Java-Komponenten
Gliederung
1. Software-Komponenten: Grundlegende Begriffe
2. Systematischer Entwicklungsprozess für Komponenten-Software
mit UML
3. Java-Komponenten-Technologien
3.1 JavaBeans-Technologie
3.2 Web-Komponenten mit Java
3.3 Enterprise JavaBeans-Technologie
4. Komponentenspezifikation
5. Komponententechnologien im Vergleich
5.1 Microsoft COM/DCOM/COM+
5.2 CORBA Component Model
5.3 Vergleich der Komponentenstandards
6. Zusammenfassung und Ausblick
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Kapitel 3
Java-Komponenten-Technologien
3.3 Enterprise JavaBeans-Technologie
– EJB-Architektur
– Session Beans
– Entity Beans
Zusammenspiel von EJBs, Konfiguration
– Transaktionsbehandlung
– Sicherheit
– Message-Driven Beans
Technische Universität Dresden
Prof. Hußmann
Seite 1
Softwarekomponenten
Kombination Session Beans - Entity Beans
• Persistente klienten-neutrale Information: Entity Beans
– z.B. Kundendaten, Kontodaten
• Transiente klienten-bezogene Information: Stateful Session Beans
–
–
–
–
Geschäftsprozesse (oder -Teilprozesse)
z.B. Kunden- und Kontenadministration
z.B. Ein-/Auszahlungsvorgänge an der Kasse
z.B. Bearbeitung von Überweisungen
• Transiente klienten-neutrale Information: Stateless Session Beans
– z.B. nicht-kundenbezogene Informationsdienste (Konditionen, Kurse etc.)
• Typische Anwendungsarchitektur:
Server
Container
Session Bean
Entity Bean
Client Application
GUI
Technische Universität Dresden
Stub
Prof. Hußmann
Softwarekomponenten
Beispiel: Session Beans und Entity Beans
AccountMgmt
Session Bean
neues Konto
Konto-Änderungen
Transfers
Session Bean
AccountNum
Entity Bean
Account
Entity Bean
Generierung von
Kontonummern
Kontostand
Umsätze
Cashier
Session Bean
Technische Universität Dresden
Prof. Hußmann
Seite 2
Softwarekomponenten
Session Bean "AccountMgmt"
public interface AccountMgmtHome extends EJBHome {
AccountMgmt create()
throws RemoteException, CreateException;
}
public interface AccountMgmt extends EJBObject {
int createNewAccount(String owner)
throws RemoteException;
AccountDetails getAccountDetails(int accountNo)
throws RemoteException, AccountNotFoundException;
}
public class AccountDetails extends Serializable {
private String owner;
private int balance;
public
public
public
public
String getOwner()...
void setOwner(String owner) ...
int getBalance() ...
void setBalance(int balance) ...
}
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Einschub: Entwurfsmuster für EJBs
• Bestimmte Programmierungstechniken
– machen Server-Komponenten leistungsstärker
– erleichtern Anpassungen von Server-Komponenten
• Beispiel: Daten-Behälter
–
–
–
–
z.B. "AccountDetails"
Hilfsklasse mit Funktion einer Datenstruktur (ähnlich "struct", "record")
Erleichtert Übergabe komplexer Parametersätze
Vorteile:
» Effizienzgewinne (Reduzierung entfernter Aufrufe)
» Übersichtlicherer Code
– Nachteile:
» Zusätzliche Hilfsklassen
» Code intuitiv weniger einsichtig
» Synchronisationsprobleme bei schreibendem Zugriff
Technische Universität Dresden
Prof. Hußmann
Seite 3
Softwarekomponenten
EJB Environment und EJB References
• Anpaßbarkeit von Server-Komponenten (hier EJBs):
– Bezug auf andere Komponenten und andere Detailinformation
über symbolische Namen
– Auflösung der symbolischen Namen erst bei Konfiguration der Anwendung
(deployment)
• EJB Environment und EJB References:
– Container realisiert eine Namens-Umgebung (environment) für die EJBs.
– EJBs greifen über Namensdienst JNDI auf Umgebungsvariablen zu.
» JNDI-Kontext java:comp/env
– Referenzen auf EJB-Home-Schnittstellen verfügbar über Umgebung:
» JNDI-Kontext java:comp/env/ejb
• Deployment:
– Bindung von Umgebungsnamen an konkrete installierte EJBs
– Angabe konkreter Werte für Umgebungsvariable
– Deklaration der Umgebungsvariablen: Deployment Descriptor
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Beispiel: Entity Bean "AccountNum"
public abstract class AccountNumEJB implements EntityBean {
// Container-managed persistent fields
public abstract int getAccountMgrId();
public abstract void setAccountMgrId(int no);
public abstract int getNextFreeNum();
public abstract void setNextFreeNum(int no);
public Integer ejbCreate(int accountMgrId)
throws CreateException {
setAccountMgrId(accountMgrId);
// Look up the start value from environment
try {
Umgebung ermitteln
Context ictx = new InitialContext();
Context myEnv = (Context)ictx.lookup("java:comp/env");
Integer startValue =
(Integer)myEnv.lookup("startValue"); Wert auslesen
setNextFreeNum(startValue.intValue());
} catch (Exception e) {
throw new CreateException();
}
return null;
}
Technische Universität Dresden
Prof. Hußmann
Seite 4
Softwarekomponenten
Beispiel: Konfiguration von "AccountNum"
• Umgebungsvariable "startValue" im Deployment Tool
– Bean-Entwickler: Deklaration (incl.Typinformation; konsistent mit Quellcode)
– Konfigurator: Einstellen konkreter Werte
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Beispiel: Zugriff auf Entity Beans
public class AccountMgmtEJB implements SessionBean {
private AccountNumHome accountNumHome;
private AccountNum accountNum;
private AccountHome accountHome;
public void ejbCreate() throws CreateException {
try {
Context ictx = new InitialContext();
Object lookupRes = ictx.lookup
("java:comp/env/ejb/AccountNum");
Auflösen
accountNumHome = (AccountNumHome)
von
PortableRemoteObject.narrow
EJB-Referenzen
(lookupRes, AccountNumHome.class);
auf Entity Beans
lookupRes = ictx.lookup
("java:comp/env/ejb/Account");
accountHome = ... narrow ... lookupRes;
...
} catch (Exception e) {
throw new CreateException();
}
... accountNum = accountNumHome.findBy...(...); ...
}
...
}
Technische Universität Dresden
Prof. Hußmann
Seite 5
Softwarekomponenten
Beispiel: Konfiguration von "AccountMgmt"
Deklaration (Aufgabe des Bean-Entwicklers):
Bindung (Aufgabe des Konfigurators):
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Beispiel: Deployment Descriptor
<ejb-jar> ...
<enterprise-beans>
<session>
<ejb-name>AccountMgmtEJB</ejb-name>
<home>AccountMgmtHome</home>
<remote>AccountMgmt</remote>
<ejb-class>AccountMgmtEJB</ejb-class>
<session-type>Stateful</session-type>
<ejb-ref>
<ejb-ref-name>ejb/AccountNum</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<home>AccountNumHome</home>
<remote>AccountNum</remote>
</ejb-ref> ...
</session>
</enterprise-beans>
</ejb-jar>
Technische Universität Dresden
Prof. Hußmann
Seite 6
Softwarekomponenten
Entwurfsfreiheit !
• Umgebungsmechanismus parametrisiert Server-Komponenten:
– Anpassung der Server-Komponente (EJB) an konkrete Einsatzsituation
möglich ohne Kenntnis des Quellcodes
– Ermöglicht z.B.:
» Auslagerung von Algorithmen aus einer Session Bean in andere
Session Beans (Entwurfsmuster "Strategy")
» Zugriff auf "Factory"-Beans
» ... und andere Entwurfsmuster
• Umgebungseinträge für EJBs ähnlich zu "Eigenschafts"-Mechanismus
von JavaBeans
– Konfiguration im Deployment-Tool ähnlich zu Objekt-Inspektor
• (Derzeit) sind keine Werkzeuge zur visuellen Komposition und
Konfiguration von EJBs bekannt !
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Kapitel 3
Java-Komponenten-Technologien
3.3 Enterprise JavaBeans-Technologie
– EJB-Architektur
– Session Beans
– Entity Beans
Zusammenspiel von EJBs, Konfiguration
– Transaktionsbehandlung
– Sicherheit
– Message-Driven Beans
Literatur: Java 2 EE Developers Guide
Technische Universität Dresden
Prof. Hußmann
Seite 7
Softwarekomponenten
Transaktionen in Client-Server-Anwendungen
• Transaktion:
– Sequenz von Anweisungen, die entweder vollständig ausgeführt oder
vollständig nicht ausgeführt wird ("unteilbare Arbeitseinheit")
– Ausführung abgeschirmt von Eingriffen anderer nebenläufiger Prozesse
– Grundelement von Mehrbenutzeranwendungen mit gemeinsamen Daten
• Beispiel (Pseudo-Code):
begin transaction
Abbuchen von Konto 1
Einbuchen auf Konto 2
Aufzeichnen in Buchungsliste
commit transaction
• Mögliche Beendigung einer Transaktion:
– "commit": vollständig ausgeführt
– "rollback": vollständig nicht ausgeführt
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Transaktionsverwaltung für Server-Komponenten
• Bean-Managed Transaction Demarcation:
– Transaktionsbeginn und -Ende explizit im Quellcode der Bean
– Transaktionsprogrammierung in Java:
» JDBC Connection interface
» JTA (Java Transaction API)
– Fehleranfällig; komplex im Fall verteilter Datenbestände
• Container-Managed Transaction Demarcation:
– Entkopplung der Transaktionsverwaltung vom Quellcode
» Aufgabenteilung: Transaktionsverwaltung / Fachlogik
– Deklaration von Transaktionen als Meta-Eigenschaften von Methoden
» "Transaktionsattribute"
– Gleiche Komponente für verschiedene Laufzeitkonfigurationen nutzbar
» einschließlich verteilter Datenbanken
Technische Universität Dresden
Prof. Hußmann
Seite 8
Softwarekomponenten
Transaktionsattribute (1)
• Für jede Methode einer Enterprise Java Bean ist ein
Transaktionsattribut spezifiziert.
– Deklaration im Deployment Descriptor
(also entweder durch Bean-Entwickler oder auch erst bei Konfiguration)
– Container fängt Aufrufe an EJBs ab und sorgt für korrekte
Transaktionsbehandlung.
• Einschränkungen:
– Session Beans:
» Transaktionsattribute nur für die benutzerdefinierten Methoden der
Zugriffsschnittstelle (nicht für Verwaltungsschnittstelle)
– Entity Beans:
» Keine Bean-Managed Transaction Demarcation zulässig
» Transaktionsattribute für create- und find-Methoden der
Verwaltungsschnittstelle möglich
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Beispiel: Transaktionsattribute von "Account"
Technische Universität Dresden
Prof. Hußmann
Seite 9
Softwarekomponenten
Transaktionsattribute (2)
• Spezifikation von Transaktionsgrenzen:
– Läuft die aufrufende Methode bereits in einer Transaktion?
– Ist eine Transaktion für die aufgerufene Methode notwendig?
– Kann eine umgebende Transaktion weiter genutzt werden? Ist eine neue
Transaktion notwendig?
• Geschachtelte Transaktionen prinzipiell nicht unterstützt (in EJB).
Bean 1
Bean 2
mA() {
...
bean2.mB();
...
}
TX?
mB() {
...
}
TX?
Beispiel: Bean 1 ist Session Bean, Bean 2 ist Entity Bean
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Werte für Transaktionsattribute
• Required
– Methodenrumpf muß in Transaktion ablaufen.
• RequiresNew
– Methodenrumpf muß in eigener Transaktion ablaufen.
• Supports
– Methodenrumpf kann, muß aber nicht in Transaktion ablaufen.
• NotSupported
– Methodenrumpf soll nicht in Transaktion ablaufen.
• Mandatory
– Methodenrumpf muß in umgebender Transaktion ablaufen.
• Never
– Methodenrumpf darf nicht in einer Transaktion ablaufen.
• Entity Beans mit Container-Managed Persistence:
– nur Required, RequiresNew und Mandatory zulässig
Technische Universität Dresden
Prof. Hußmann
Seite 10
Softwarekomponenten
Transaktionsattribut "Required"
• Alle von der Methode ausgelösten Änderungen sind "atomar"
(d.h. entweder vollständig ausgeführt oder nicht ausgeführt).
• Es ist irrelevant, ob die aufrufende Methode bereits in einer Transaktion
abläuft:
– Falls aufrufende Methode in Transaktionskontext: Keine besondere Aktion
– Falls aufrufende Methode in keinem Transaktionskontext:
» Neuer Transaktionskontext wird für aktuelle Methode angelegt.
» ... und nach Beendigung aktueller Methode beendet (commit).
• Häufige Form der Transaktionsspezifikation
• Beispiele:
– Methode einer Session Bean, die persistente Daten verändert
(z.B. debit())
– Alle Methoden von Entity Beans
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Transaktionsattribut "RequiresNew"
• Alle von der Methode ausgelösten Änderungen sind "atomar"
(d.h. entweder vollständig ausgeführt oder nicht ausgeführt).
• Neue Transaktion:
– Falls aufrufende Methode in Transaktionskontext:
» Umgebende Transaktion wird ausgesetzt.
» Neuer Transaktionskontext wird für aktuelle Methode angelegt.
» ... und nach Beendigung aktueller Methode beendet (commit).
» Ausgesetzte umgebende Transaktion wird wieder aufgenommen.
• Beispiel:
– Sammlung von Benutzungsinformationen
» z.B. Aufzeichnung des Versuchs, eine Anwendungsfunktion aufzurufen
» "Required" würde keine Aufzeichnung liefern, falls Versuch fehlschlägt!
Technische Universität Dresden
Prof. Hußmann
Seite 11
Softwarekomponenten
Transaktionsattribut "Supports"
• "Atomare" oder "nicht-atomare" Ausführung der Methode spielt keine
Rolle.
– Keine besondere Aktion, egal ob aufrufende Methode in Transaktionskontext
– Falls Transaktionskontext vorhanden, wird Methode in diesem ausgeführt.
• Kann Durchsatz durch Einsparung von Transaktionen erhöhen.
• Nur mit Vorsicht zu verwenden
• Beispiel:
– Methode einer Session Bean, die nur Daten liest
(z.B. getBalance())
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Transaktionsattribut "NotSupported"
• Wichtigster Einsatz:
Speichermedien, die "Transaktionen nicht verstehen"
– z.B. gewöhnliche Dateien
– z.B. HTTP/XML-Server
• Behandlung im Container:
– Falls aufrufende Methode in Transaktionskontext:
» Umgebende Transaktion wird ausgesetzt (und später fortgesetzt)
– Methode wird mit ohne Transaktionskontext" aufgerufen
» genauer: "undefinierter Transaktionskontext"
Technische Universität Dresden
Prof. Hußmann
Seite 12
Softwarekomponenten
Kapitel 3
Java-Komponenten-Technologien
3.3 Enterprise JavaBeans-Technologie
– EJB-Architektur
– Session Beans
– Entity Beans
Zusammenspiel von EJBs, Konfiguration
– Transaktionsbehandlung
– Sicherheit
– Message-Driven Beans
Literatur: Java 2 EE Developers Guide
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Sicherheitsaspekte
• Extrem wichtige Fragen für verteilte Anwendungen in großen Netzen:
– Authentication: Welcher Benutzer ruft eine bestimmte Methode auf?
» Benutzername/Paßwort, Zertifikate z.B. nach X.509, ...
– Authorization: Welche Benutzergruppe ist berechtigt, bestimmte Methoden
aufzurufen?
• Server-Komponenten:
– Verantwortung für Sicherheitskonfiguration hauptsächlich bei Installation
(Deployment)
– Werkzeug zur Verwaltung von Benutzern, Benutzergruppen, Zertifikaten
– Verwaltungsmechanismus für Zugriffsrechte auf Methoden
• Weitere Unterstützungsfunktionen für Sicherheitsaspekte:
– automatische Verschlüsselung von entfernten Methodenaufrufen
» z.B. CheckBox "Use SSL" in EJB-Deployment-Werkzeugen
Technische Universität Dresden
Prof. Hußmann
Seite 13
Softwarekomponenten
Sicherheitsverwaltung
• Container-Managed Security:
– Deklaration von Sicherheitsattributen mit Deployment Tool
– Quellcode völlig unabhängig von Sicherheitskonfiguration
– (siehe folgendes Beispiel)
• Bean-Managed Security:
– Programmierschnittstelle zum Zugriff auf Sicherheitsinformationen
» Methoden getCallerPrincipal() und isCallerInRole()
» Verwendung des Pakets java.security
– Nur in Spezialfällen nötig
» z.B. Autorisierung abhängig von dynamischer Information wie Tageszeit,
Datenbankinhalten etc.
– Quellcode bei Konfiguration anpaßbar an spezifische Sicherheitsrollen:
» Symbolische Namen (security role names) im Quellcode
» Bindung an konkreten Rollennamen beim Deployment
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Beispiel: Deklarative Sicherheitsverwaltung (1)
Definition
von
Sicherheitsrollen
Rechtevergabe
Technische Universität Dresden
Prof. Hußmann
Seite 14
Softwarekomponenten
Beispiel: Deklarative Sicherheitsverwaltung (2)
Definition des
zu verwendenden Verfahrens
zur Authentifikation
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Kapitel 3
Java-Komponenten-Technologien
3.3 Enterprise JavaBeans-Technologie
– EJB-Architektur
– Session Beans
– Entity Beans
Zusammenspiel von EJBs, Konfiguration
– Transaktionsbehandlung
– Sicherheit
– Message-Driven Beans
Literatur: Java Message Service Tutorial, EJB Specification 2.0
Technische Universität Dresden
Prof. Hußmann
Seite 15
Softwarekomponenten
Nachrichtendienst (Messaging)
• Kopplungsarten zwischen Softwarekomponenten:
– Enge Kopplung: synchroner Aufruf
» z.B. mit Java RMI
– Lose Kopplung: synchroner Aufruf
» Aufrufer wartet nicht auf Verfügbarkeit des Aufgerufenen
» Aufgerufener verarbeitet Aufrufe unter eigener Zeitkontrolle
» z.B. mit Java Messaging Service (JMS)
• Typische Verwendung in Geschäftsanwendungen (Beispiele):
– Lagerverwaltung benachrichtigt Einkauf, wenn Vorrat eines Produkts unter
eine Schranke sinkt.
– Neuer Artikel registriert sich bei Produktkatalog und Lagerverwaltung.
– Artikel meldet Preisänderungen an alle interessierten anderen
Komponenten.
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Punkt-zu-Punkt-Benachrichtigung
•
•
•
•
Point-to-point: Nachricht von Client 1 an Client 2 (genau ein Empfänger)
Client 1 und Client 2 zeitlich völlig entkoppelt
Bestätigung des Empfangs
Programmiertechnisch: JMS Destination ist Queue
Technische Universität Dresden
Prof. Hußmann
Seite 16
Softwarekomponenten
Veröffentlichung und Abonnement
• Publish/subscribe: Nachricht hat für den Sender unbekannte Empfänger
unbestimmter Anzahl.
• Client 2 bzw. 3 empfangen nur Nachrichten, nachdem sie sich registriert
haben (subscribe).
• Programmiertechnisch: JMS Destination ist Topic
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Message-Driven EJBs
• Client-Sicht: Normale JMS Destination
• Server-Sicht: EJB
– wird im Container ausgeführt: Sicherheit, Transaktionen, ...
– empfängt Nachrichten und reagiert darauf (z.B. durch Aufrufe an EJBs)
– keine eigene Identität, kein interner Zustand
• Zuordnung zur JMS Destination beim Deployment
– Entscheidung, ob Bean als Queue oder Topic nutzbar
Client Application
JMS Client
Technische Universität Dresden
Server
Container
JMS
Destination
Prof. Hußmann
Seite 17
Message-Driven
Bean Instances
Softwarekomponenten
Realisierung von Message-Driven EJBs
• Keine Verwaltungsschnittstelle, keine Aufrufschnittstelle
• Message-Driven Bean Class:
– Implementiert javax.ejb.MessageDrivenBean
– Implementiert javax.jms.MessageListener
– Öffentlicher argumentloser Konstruktor
– Bereitzustellende Methoden:
» ejbCreate()
» onMessage()
» ejbRemove()
• Auswertung des Nachrichten-Inhalts:
– Verwendung von JMS-Funktionen
– JMS-Nachrichten: verschiedene Typen, z.B. TextMessage, ObjectMessage
Technische Universität Dresden
Prof. Hußmann
Softwarekomponenten
Code-Gerüst einer Message-Driven Bean
import javax.jms.Message;
import javax.jms.TextMessage;
public class XYZBean implements
javax.ejb.MessageDrivenBean, javax.jms.MessageListener {
public XYZBean() {}
public void ejbCreate() throws
... Initialisierungen ...}
CreateException {
public void ejbRemove(){}
public void onMessage(Message msg) {
... Auswerten der Nachricht, z.B. bei TextMessage:
String strMsg =((TextMessage)msg).getText();
...
... Code z.B. zum Kontaktieren anderer EJBs über
... JNDI-lookup
}
}
Technische Universität Dresden
Prof. Hußmann
Seite 18
Softwarekomponenten