Client/Server-Programmierung - Betriebssysteme und verteilte

Werbung
Client/Server-Programmierung
WS 2014/2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
i
Client/Server-Programmierung
WS 2014/2015
0
Organisation
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
2
Zu meiner Person
➥ Studium der Informatik an der Techn. Univ. München
➥ dort 1994 promoviert, 2001 habilitiert
➥ Seit Apr. 2004 Prof. für Betriebssysteme und verteilte Systeme an
der Univ. Siegen
➥ Forschung: Beobachtung, Analyse und Steuerung paralleler und
verteilter Systeme
➥ Mentor für die Bachelor-/Master-Studiengänge Informatik mit
Nebenfach/Vertiefung Mathematik
➥ e-mail: rolanda
.d
wismuellera
@duni-siegena
.d e
➥ Tel.: 0271/740-4050
➥ Büro: H-B 8404
➥ Sprechstunde: Mo., 14:15-15:15 Uhr
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
3
Zur Fachgruppe “Betriebssysteme / verteilte Systeme“
Andreas Hoffmann
Adrian Kacso
andreas.hoffmann@uni−siegen.de
0271/740−4047
H−B 8405
adrian.kacso@uni−siegen.de
0271/740−3966
H−B 8406
Elektronische Prüfungs− und
Übungssysteme an Hochschulen
IT−Sicherheit
Webtechnologien
Mobile Anwendungen
Kommunikationsprotokolle für
drahtlose Sensornetze
Kommunikation und Koordination
in verteilten Systemen
Betriebssysteme (RT, Embedded)
Julia Dauwe
Alexander Kordes
julia.dauwe@uni−siegen.de
0271/740−2967
H−B 8405
alexander.kordes@uni−siegen.de
0271/740−4011
H−B 8407
Context Aware Systems
Bring Your Own Device (BYOD)
Mobile Anwendungen und
Datenschutz
Roland Wismüller
Betriebssysteme / verteilte Systeme
Automotive Electronics
Fahrzeugnetzwerke
Robustheit, Fehleranalyse,
Fehlerdetektion
Client/Server-Programmierung (1/15)
4
Lehrangebot
Vorlesungen/Praktika
➥ Rechnernetze I, 5 LP (jedes SS)
➥ Rechnernetze Praktikum, 5 LP (jedes WS)
➥ Rechnernetze II, 5 LP (jedes SS)
➥ Betriebssysteme I, 5 LP (jedes WS)
➥ Parallelverarbeitung, 5 LP (jedes WS)
➥ Verteilte Systeme, 5 LP (jedes SS)
➥ (wird auch als Betriebssysteme II anerkannt)
➥ Client/Server-Programmierung, 5 LP (jedes WS)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
5
Lehrangebot ...
Projektgruppen
➥ z.B. Werkzeug zur Algorithmen-Visualisierung
➥ z.B. Infrastruktur zum Analysieren des Android Market
Abschlussarbeiten (Bachelor, Master, Diplom)
➥ Themengebiete: Mobile Plattformen (iOS, Android), Sensornetze,
Parallelverarbeitung, Monitoring, ...
➥ z.B. Statische Analyse des Informationsflusses in Android Apps
Seminare
➥ Themengebiete: Webtechnologien, Sensornetze, Android, ...
➥ Ablauf: Blockseminare
➥ 30 Min. Vortrag, 5000 Worte Ausarbeitung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
6
Zur Vorlesung
➥ Vorlesung mit Praktikum: 2+2 SWS, 5 LP (4 bzw. 8 LP möglich)
➥ Termine:
➥ Fr., 12:30 - 14:00, H-F 116 (Vorl.) bzw. H-A 4111 (Prakt.)
➥ Mo., 16:00-17:30, H-B 8409/10 (Vorl.) bzw. H-A 4111 (Prakt.)
➥ Information, Folien und Ankündigungen:
➥ http://www.bs.informatik.uni-siegen.de/lehre/
ws1415/csp
➥
➥
Folienskript vollständig verfügbar
Folien werden ggf. leicht aktualisiert und i.d.R. spätestens
am Tag vor der Vorlesung bereitgestellt (als PDF)
➥ Codebeispiele finden Sie lokal auf den Laborrechnern unter
/home/wismueller/CSP
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
7
Lernziele
➥ Wissen um die Grundlagen, Techniken, Methoden und
Werkzeuge der verteilten Programmierung
➥ insbesondere objektorientierte und serviceorientierte
Middleware, sowie Komponenten
➥ Praktische Erfahrungen in der Programmierung von
Client/Server-Anwendungen
➥ Praktische Erfahrungen im Umgang mit unterschiedlicher
Middleware
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
8
Methodik
➥ Vorlesung: Grundlagen
➥ theoretisches Wissen zur verteilten Systemen, Middleware
und Komponenten
➥ Code-Beispiele und Tutorials“
”
➥ Praktikum: praktische Anwendung
➥ Nachvollziehen der Tutorials
➥ eigenständige Programmierarbeit
➥
➥
praktische Erfahrung, auch: Aufwerfen von Fragen
Realisierung einer kleinen Börsenanwendung
➥ mit RMI, CORBA, EJB und Web Services
➥ zusätzlich kleinere einführende und weiterführende Aufgaben
➥ Programmierung ausschließlich in Java
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
9
Prüfung
➥ Mündliche Prüfung
➥ Dauer ca. 40 min.
➥ Stoff: Vorlesung und Praktikum!
➥ Prüfung erstreckt sich auch auf die praktischen Arbeiten
➥ aktive Teilnahme am Praktikum ist Zulassungs-Voraussetzung!
➥ Anmeldung:
➥ Terminabsprache im Sekretariat bei Fr. Baule
➥
➥
per Email (andreaa
.d
baulea
@d
uni-siegena
.de)
oder persönlich (H-B 8403, nachmittags)
➥ Anmeldung beim Prüfungsamt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
10
Organisatorisches zum Praktikum
➥ Benutzerordnung und Kartenschlüsselantrag:
➥ http://www.bs.informatik.uni-siegen.de/lehre/
ws1415/csp
➥ Abgabe bis bis 24.10. bei Fr. Baule, H-B 8403 (nachmittags)
oder in der Vorlesung
➥ Praktikumsbeginn: nächste Woche
➥ Einführung in die Rechner-Umgebung (Linux)
➥ Ausgabe der Kennungen
➥
Benutzungsvereinbarung im WWW beachten!
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
11
Rechnerumgebung im Labor H-A 4111
➥ Linux-PCs, privates IP-Netz, beschränkter Internet-Zugang
Fachgruppennetz (bs.informatik.uni−siegen.de) / Internet
ssh (nur pubkey)
Server−Cluster bvsclk01 bvsclk02 bvsclk03 bvsclk04
(je 2 x XEON,
je 2 Cores,
2,66 GHz, 4 GB)
http
ftp
https
bsclk01 bsclk02 bsclk03 bsclk04
Labornetz
(lab.bvs) 1 Gbit/s
Proxy
11
00
00
11
0
... 1
0
1
11
00
0
00 ... 1
11
1
0
bslab01−06,11−12,14−18
13 Arbeitsplätze
(Intel, 2 Cores mit HT,
3,3 GHz, 4 GB)
Roland Wismüller
Betriebssysteme / verteilte Systeme
File
Server
Client/Server-Programmierung (1/15)
bslab07−10,13,19
6 Arbeitsplätze
(Intel, 4 Cores,
3,2 GHz, 4 GB)
12
Inhalt der Vorlesung
➥ Grundlagen: Wiederholung
➥ Architekturmodelle
➥ Zeit und Zustand in verteilten Systemen
➥ Middleware
➥ Java RMI
➥ Java Datenbank-Schnittstelle JDBC
➥ CORBA
➥ Architektur, Dienste, IDL, ...
➥ Java Komponenten-Modelle
➥ Einführung
➥ Java Beans
➥ Enterprise Java Beans
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
13
Inhalt der Vorlesung ...
➥ Servlets und JSP
➥ Web Services
➥ XML, SOAP, WSDL, ...
➥ Axis2
➥ Weitere Client/Server-Technologien
➥ u.a. .NET, DCOM
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
14
Zeitplan der Vorlesung (vorläufig!)
Datum
Montags-Termin
Datum
Freitags-Termin
06.10.
13.10.
20.10.
27.10.
03.11.
10.11.
17.11.
24.11.
01.12.
08.12.
15.12.
—
V: Grundlagen, Wdh.
P: RMI
V:CORBA
P: RMI
P: RMI
P: CORBA
P: CORBA
P: CORBA
P: CORBA
P: EJB
10.10.
17.10.
24.10.
31.10.
07.11.
14.11.
21.11.
28.11.
05.12.
12.12.
19.12.
V: Grundlagen, Wdh.
V: JDBC
V: CORBA
V: CORBA
V: Java Beans
V: EJB
V: EJB
V: EJB
V: Servlets, JSP
V: Web Services
V: — (ggf. P: EJB)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
15
Zeitplan der Vorlesung (vorläufig!) ...
Datum
05.01.
12.01.
19.01.
26.01.
02.02.
Montags-Termin
P: EJB
P: EJB
P: Web Services
P: Web Services
P: Web Services
Roland Wismüller
Betriebssysteme / verteilte Systeme
Datum
Freitags-Termin
09.01.
16.01.
23.01.
30.01.
06.02.
V: Web Services
V: Web Services
V: Weitere Technologien
P: Web Services
Ersatztermin
Client/Server-Programmierung (1/15)
16
Literatur
Allgemeinere Literatur
➥ Ulrike Hammerschall, Verteilte Systeme und Anwendungen.
Pearson Studium, 2005.
➥ Robert Orfali, Dan Harkey, Client/Server-Programming with Java
and Corba. John Wiley & Sons, 1998.
Verteilte Systeme
➥ George Coulouris, Jean Dollimore, Tim Kindberg. Verteilte
Systeme – Konzepte und Design, 3. Auflage. Pearson Studium,
2002.
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
17
Literatur ...
Verteilte Programmierung mit Java
➥ Cay S. Horstmann, Gary Cornell. Core Java 2, Band 2 –
Expertenwissen. Sun Microsystems Press / Addison Wesley,
2008.
➥ Torsten Langner. Verteilte Anwendungen mit Java.
Markt+Technik, 2002.
➥ Jim Farley, William Crawford, David Flanagan. Java Enterprise in
a Nutshell, 3rd Edition. O’Reilly, 2005.
CORBA und COM
➥ Johann Hofmann, Fritz Jobst, Roland Schabenberger.
Programmieren mit COM und CORBA, Hanser, 2001.
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
18
Literatur ...
Enterprise JavaBeans
➥ Rima P. Sriganesh, Gerald Brose, Micah Silverman. Mastering
Enterprise JavaBeans 3.0. Wiley, 2006.
➥ Bill Burke, Richard Monson-Haefel. Enterprise JavaBeans 3.0,
5th Edition. O’Reilly, 2006.
Servlets
➥ Jason Hunter, William Crawford. Java Servlet Programmierung.
O’Reilly, 2002.
Web Services
➥ Manfred Hein, Henner Zeller. Java Web Services,
Addison-Wesley, 2003.
➥ Torsten Langner. Web Services mit Java, Markt+Technik, 2003.
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
19
Client/Server-Programmierung
WS 2014/2015
1
Grundlagen: Wiederholung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
20
1 Grundlagen: Wiederholung ...
Inhalt
➥ Architekturmodelle
➥ Zeit und Zustand in verteilten Systemen
➥ Middleware
➥ Java RMI
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
21
1.1 Architekturmodelle
Client/Server-Modell
➥ Asymmetrisches Modell: Server stellen Dienste bereit, die von
(mehreren) Clients genutzt werden können
➥ Server verwalten i.a. Ressourcen (zentralisiert)
Client
Aufruf
Ergebnis
Client
Aufruf
Server
Server
Ergebnis
Prozeß
Rechner
Server kann selbst
wieder als Client agieren
➥ Häufigstes Modell für verteilte Anwendungen (ca. 80 %)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
22
1.1 Architekturmodelle ...
Client/Server-Modell ...
➥ I.A. nebenläufige Anfragen mehrerer Client-Prozesse an den
Server-Prozeß
Start
Client
Anfrage
(request)
Ende
Antwort
(reply)
Zeit
Server
Client
➥ Beispiele: Dateiserver, WWW-Server, DB-Server, DNS-Server, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
23
1.1 Architekturmodelle ...
n-Tier-Architekturen
➥ Verfeinerungen der Client/Server-Architektur
➥ Modelle zur Verteilung einer Anwendung auf die Knoten einer
verteilten Systems
➥ Vor allem bei Informationssystemen verwendet
➥ Tier (engl. Schicht / Stufe) kennzeichnet einen unabhängigen
Prozeßraum innerhalb einer verteilten Anwendung
➥ Prozeßraum kann, muß aber nicht physischem Rechner
entsprechen
➥ mehrere Prozeßräume auf einem Rechner möglich
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
24
1.1 Architekturmodelle ...
2-Tier-Architektur
➥ Client- und Server-Tier
➥ Keine eigene Tier für die Anwendungslogik
Client−Tier
Präsentation
Anwendungslogik
(Verteilung auf Client−
und Server−Tier variiert)
Server−Tier
Datenhaltung
➥ Vorteil: einfach, performant
➥ Nachteil: schwer wartbar, schlecht skalierbar
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
25
1.1 Architekturmodelle ...
3-Tier-Architektur
Client−Tier
Präsentation
Middle−Tier
Anwendungslogik
Server−Tier
Datenhaltung
➥ Standard-Verteilungsmodell für einfache Web-Anwendungen:
➥ Client-Tier : Web-Browser zur Anzeige
➥ Middle-Tier : Web-Server mit Servlets / JSP / ASP
➥ Server-Tier : Datenbank-Server
➥ Vorteile: Anwendungslogik zentral administrierbar, skalierbar
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
26
1.1 Architekturmodelle ...
Beispiel: typische Internet-Anwendung
Intranet
Web−
Client
Internet
1
0
Web−
Client
Tier 1
Roland Wismüller
Betriebssysteme / verteilte Systeme
11
00
00
11
00
11
00
11
000
111
000
111
000
111
000
111
111
000
000
111
00
11
00
11
000
111
000
111
000
111
000
111
11
00
00
11
00
11
00
11
000
111
000
111
000
111
000
111
Web−
Server
Anwen−
dungs−
Server
Daten−
bank−
Server
Tier 2
Tier 3
Tier 4
Client/Server-Programmierung (1/15)
27
1.1 Architekturmodelle ...
Beispiel: typische Internet-Anwendung
DMZ
Internet
1
0
0
1
Web−
Client
Tier 1
Roland Wismüller
Betriebssysteme / verteilte Systeme
Firewall
11 11
00
0
1
00
00
11
00
11
00
11
00
11
0
1
00
11
00
11
00
11
00
11
00
11
0
1
00 111
11
00
11
000
111
000
00111
11
0
1
000
000
111
000 111
111
000
Firewall
Web−
Client
Intranet
111
000
000
111
00
11
00
11
00
11
000
111
000
111
000
111
000 111
111
000 111
000
Web−
Server
11
00
00
11
00
11
00
11
00
11
000
111
000
111
000
111
000
111
Web−
Server
Anwen−
dungs−
Server
Daten−
bank−
Server
Tier 2
Tier 3
Tier 4
Client/Server-Programmierung (1/15)
27
1.2 Zeit und Zustand in verteilten Systemen
Was ist der Unterschied zwischen einem verteilten System und
einem Ein-/Mehrprozessorsystem?
➥ Ein- bzw. Mehrprozessorsystem:
➥ nebenläufige Prozesse: pseudo-parallel durch time sharing
bzw. echt parallel
➥ globale Zeit: alle Ereignisse in den Prozessen lassen sich
zeitlich eindeutig ordnen
➥ globaler Zustand: zur jeder Zeit kann ein eindeutiger Zustand
des Systems angegeben werden
➥ Verteiltes System
➥ echte Parallelität
➥ keine globale Zeit
➥ kein eindeutiger globaler Zustand
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
28
1.2 Zeit und Zustand in verteilten Systemen ...
Globale Zeit
➥ Auf Ein-/Mehrprozessorsystem
➥ jedem Ereignis kann (zumindest theoretisch) ein eindeutiger
Zeitstempel derselben lokalen Uhr zugeordnet werden
➥ bei Mehrprozessorsystemen: Synchronisation am
gemeinsamen Speicher
➥ In verteilten Systemen:
➥ viele lokale Uhren (eine pro Knoten)
➥ exakte Synchronisation der Uhren (prinzipiell!) nicht möglich
➥ ⇒ Reihenfolge von Ereignissen auf verschiedenen Knoten
nicht (immer) eindeutig zu ermitteln
➥ (vgl. spezielle Relativitätstheorie)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
29
1.2 Zeit und Zustand in verteilten Systemen ...
Eine Auswirkung der Verteiltheit
➥ Szenario: zwei Prozesse beobachten zwei andere Prozesse
x
Beobachter A
Prozess 1
x
Prozess 2
Beobachter B
y
z
y
z
z x
y
➥ Die Beobachter sehen die Ereignisse ggf. in unterschiedlicher
Reihenfolge!
➥ Problem z.B., falls die Beobachter replizierte Datenbanken und
die Ereignisse Datenbank-Updates sind
➥ Replikate sind nicht mehr konsistent!
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
30
1.2 Zeit und Zustand in verteilten Systemen ...
Globaler Zustand: Ein Beispiel zur Motivation
➥ Szenario: Peer-to-Peer -Anwendung, Prozesse senden sich
gegenseitig Aufträge
➥ Frage: wann kann die Anwendung terminieren?
➥ Falsche Antwort: wenn kein Prozeß mehr einen Auftrag
bearbeitet
➥ Grund: Aufträge können noch in Nachrichten unterwegs sein!
Prozeß 1
Prozeß 2
Auftrag
idle
idle
➥ Weitere Anwendungen: verteilte Garbage-Collection, verteilte
Deadlock -Erkennung, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
31
1.2 Zeit und Zustand in verteilten Systemen ...
➥ Wie bestimmt sich der Gesamtzustand eines verteilten Prozeßsystems?
➥ naiv: Summe der Zustände aller Prozesse (falsch!)
➥ Zwei Aspekte müssen beachtet werden:
➥ Nachrichten, die noch in Übertragung sind
➥
müssen mit in den Zustand aufgenommen werden
➥ Fehlen einer globalen Zeit
➥
➥
➥
ein Globalzustand zur Zeit t kann nicht definiert werden!
Zustände der Prozesse beziehen sich immer auf lokale
(und damit unterschiedliche) Zeiten
Frage: Bedingung an die lokalen Zeiten? ⇒ konsistente
Schnitte
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
32
1.3 Middleware
Verteilte Anwendung (VA)
VA−
Komponente
VA−
Komponente
VS−Knoten
Netz
VS−Knoten
Verteiltes System (VS)
Verteilte Anwendung (VA)
VA−
VA−
Komponente
Komponente
Middleware Netz Middleware
VS−Knoten
VS−Knoten
Verteiltes System (VS)
➥ VA nutzt VS für Kommunikation zwischen ihren Komponenten
➥ VSe bieten i.a. nur einfache Kommunikationsdienste an
➥ direkte Nutzung: Netzwerkprogrammierung
➥ Middleware bietet intelligentere Schnittstellen
➥ verbirgt Details der Netzwerkprogrammierung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
33
1.3 Middleware ...
➥ Middleware ist Schnittstelle zwischen verteilter Anwendung und
verteiltem System
➥ Ziel: Verbergen der Verteilungsaspekte vor der Anwendung
➥ u.a. Zugriffs- und Orts-Transparenz
➥ Middleware kann auch Zusatzdienste für Anwendungen bieten
➥ starke Unterschiede bei existierender Middleware
➥ Unterscheidung:
➥ kommunikationsorientierte Middleware
➥
(nur) Abstraktion von der Netzwerkprogrammierung
➥ anwendungsorientierte Middleware
➥
neben Kommunikation steht Unterstützung verteilter
Anwendungen im Mittelpunkt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
34
1.3.1 Kommunikationsorientierte Middleware
➥ Fokus: Bereitstellung einer Kommunikationsinfrastruktur für
verteilte Anwendungen
➥ Aufgaben:
➥ Kommunikation
➥ Behandlung der Heterogenität
➥ Fehlerbehandlung
Anwendung
Kommunikationsorientierte
Middleware
Betriebssystem / verteiltes System
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
35
1.3.1 Kommunikationsorientierte Middleware ...
Entfernter Prozeduraufruf (RPC, Remote Procedure Call)
➥ Ermöglicht einem Client den Aufruf einer Prozedur in einem
entfernten Server-Prozeß
Client−
Prozeß
y = P(x);
Eingabeparameter
Resultate
P(a) {
Server−
...
return b; Prozeß
}
➥ Kommunikation nach Anfrage / Antwort-Prinzip
Entfernter Methodenaufruf (RMI, Remote Method Invocation)
➥ Ermöglicht einem Objekt, Methoden eines entfernten Objekts
aufzurufen
➥ Prinzipiell sehr ähnlich zu RPC
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
36
1.3.1 Kommunikationsorientierte Middleware ...
Gemeinsame Grundkonzepte entfernter Aufrufe
➥ Client und Server werden durch Schnittstellendefinition entkoppelt
➥ legt Namen der Aufrufe, Parameter und Rückgabewerte fest
➥ Einführung von Client-Stubs und Server-Stubs (Skeletons) als
Zugriffsschnittstelle
➥ werden automatisch aus Schnittstellendefinition generiert
➥
IDL-Compiler, Interface Definition Language
➥ sind verantwortlich für Marshalling / Unmarshalling
sowie für die eigentliche Kommunikation
➥ realisieren Zugriffs- und Ortstransparenz
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
37
1.3.1 Kommunikationsorientierte Middleware ...
Funktionsweise der Client- und Server-Stubs (RPC)
Client−Prozeß
Server−Prozeß
Client−Stub
y=P(x)
P(a) {
Argumente a in
Nachricht m1 packen
send(Server, m1);
}
receive(Server, m2) ;
Ergebnis b aus Nach−
richt m2 auspacken
return b;
Roland Wismüller
Betriebssysteme / verteilte Systeme
Server−Skeleton
while (true) {
receive(m1);
client=sender(m1);
Argumente x aus Nach−
richt m1 auspacken
y = P(x) ;
}
Ergebnis y in Nach−
richt m2 packen
send(client, m2);
Client/Server-Programmierung (1/15)
P(a) {
...
return b;
}
38
1.3.1 Kommunikationsorientierte Middleware ...
Basis von RMI: Das Proxy-Pattern
➥ Client arbeitet mit Stellvertreterobjekt (Proxy) des eigentlichen
Serverobjekts
➥ Proxy und Serverobjekt implementieren dieselbe Schnittstelle
➥ Client kennt / nutzt lediglich diese Schnittstelle
<<interface>>
Schnittstelle
Client
Roland Wismüller
Betriebssysteme / verteilte Systeme
Proxy
Objekt
Client/Server-Programmierung (1/15)
39
1.3.1 Kommunikationsorientierte Middleware ...
Ablauf eines entfernten Methodenaufrufs
Client−Rechner
Server−Rechner
Server
Client
Selbe Schnitt−
stelle wie beim
Objekt
Client ruft
eine
Methode
auf
Proxy
Client−BS
Netzwerk
Roland Wismüller
Betriebssysteme / verteilte Systeme
Skeleton ruft
dieselbe
Methode für
das Objekt auf
Objekt
Status
Methode
Skeleton
Schnitt−
stelle
Server−BS
Verpackter Aufruf wird über das Netzwerk weitergegeben
(Objekt−ID, Methodenname, Parameter)
Client/Server-Programmierung (1/15)
40
1.3.1 Kommunikationsorientierte Middleware ...
Erstellung eines Client/Server-Programms
Server−
Prozeduren
Compiler
Server
Server−Skel.
Schnittstellen−
beschreibung
RPC/RMI
Laufzeit−
Bibliothek
IDL−
Compiler
Client−Stubs
Client−
Programm
Compiler
Client
➥ Gilt prinzipiell für alle Realisierungen entfernten Aufrufe
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
41
1.3.2 Anwendungsorientierte Middleware
➥ Setzt auf kommunikationsorientierter Middleware auf
➥ Erweitert diese um:
➥ Laufzeitumgebung
➥ Dienste
➥ Komponentenmodell
Anwendungs− Anwendungs− Anwendungs−
komponente komponente komponente
Komponentenmodell
Dienste
Laufzeitumgebung
Dienste
Kommunikationsinfrastruktur
Betriebssystem / verteiltes System
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
42
1.3.2 Anwendungsorientierte Middleware ...
Laufzeitumgebung
➥ Ressourcenverwaltung
➥ Pooling von Prozessen, Threads, Verbindungen
➥ Steuerung der Nebenläufigkeit
➥ Verbindungsverwaltung
➥ Verbesserung der Verfügbarkeit
➥ Replikation, Clustering
➥ Sicherheitsmechanismen
➥ Authentifizierung und Autorisierung
➥ Vertraulichkeit und Integrität
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
43
1.3.2 Anwendungsorientierte Middleware ...
Dienste
➥ Namensdienst (Verzeichnisdienst)
➥ Zuordnung von Namen zu Referenzen (Adressen)
➥ Sitzungsverwaltung
➥ Transaktionsverwaltung
➥ Persistenzdienst
➥ z.B. objektrelationaler Mapper (OR-Mapper)
Komponentenmodell
➥ Komponentenbegriff, Schnittstellenverträge, Laufzeitumgebung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (1/15)
44
Client/Server-Programmierung
WS 2014/2015
13.10.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
ii
1.4 Java RMI
➥ Java RMI ist fester Bestandteil von Java
➥ erlaubt Nutzung entfernter Objekte
➥ Wichtige elemente von Java RMI (im Paket java.rmi):
➥ entfernte Objektimplementierungen
➥ Client-Schnittstellen (Stubs) zu entfernten Objekten
➥ Namensdienst, um Objekte im Netz ausfindig zu machen
➥ Stub- und Skeleton-Klassen werden automatisch aus Schnittstellendefinition (Java Interface) generiert
➥ ab JDK 1.5 dynamisch zur Laufzeit
➥ Namensdienst: RMI Registry
➥ Verteilte Garbage-Collection
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
45
1.4 Java RMI ...
1.4.1 Hello World mit Java RMI
Client−JVM
Interface
interface Hello {
String sayHello();
}
Client−Klasse
class HelloClient {
...
Hello h;
...
s = h.sayHello();
...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Server−JVM
Server−Klasse
class HelloServer
implements Hello {
String sayHello() {
return "Hello World";
}
...
Client/Server-Programmierung (2/15)
46
1.4.1 Hello World mit Java RMI ...
Ablauf der Entwicklung:
1. Entwurf der Schnittstelle für das Server-Objekt
2. Implementierung der Server-Klasse
3. Entwicklung der Server-Anwendung zur Aufnahme des
Server-Objekts
4. Entwicklung der Client-Anwendung mit Aufrufen des
Server-Objekts
5. Übersetzen und Starten des Systems
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
47
1.4.1 Hello World mit Java RMI ...
Entwurf der Schnittstelle für das Server-Objekt
➥ Wird als normale Java-Schnittstelle spezifiziert
➥ Muß von java.rmi.Remote abgeleitet werden
➥ kein Erben von Operationen, nur Markierung als
Remote-Interface
➥ Jede Methode muß die Ausnahme java.rmi.RemoteException
(oder eine Basisklasse davon) auslösen können
➥ Basisklasse für alle möglicherweise auftretenden Fehler
➥
im Client, bei der Übertragung, im Server
➥ Keine Einschränkungen gegenüber lokalen Schnittstellen
➥ aber: semantische Unterschiede (Parameterübergabe!)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
48
1.4.1 Hello World mit Java RMI ...
Hello-World Interface
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
Marker−Schnittstelle ,
enthält keine Methoden,
markiert Interface als
RMI−Schnittstelle
Roland Wismüller
Betriebssysteme / verteilte Systeme
RemoteException zeigt
Fehler im entfernten
Objekt bzw. bei Kommu−
nikation an
Client/Server-Programmierung (2/15)
49
1.4.1 Hello World mit Java RMI ...
Implementierung der Server-Klasse
➥ Eine Klasse, die remote nutzbar sein soll, muß:
➥ ein festgelegtes Remote-Interface implementieren
➥ i.d.R. von java.rmi.server.UnicastRemoteObject abgeleitet
werden
➥ definiert Aufrufsemantik: Punkt-zu-Punkt
➥ einen Konstruktor besitzen, der RemoteException werfen kann
➥
Erzeugung des Objekts muß in try-catch-Block stehen
➥ Methoden brauchen throws RemoteException nicht nochmals
anzugeben
➥ ist bereits im Interface definiert
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
50
1.4.1 Hello World mit Java RMI ...
Hello-World Server (1)
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class HelloServer extends UnicastRemoteObject
implements Hello {
public HelloServer() throws RemoteException {
super();
}
public String sayHello() {
return "Hello World!";
Remote Methode
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
51
1.4.1 Hello World mit Java RMI ...
Entwicklung der Server-Anwendung zur Aufnahme des
Server-Objekts
➥ Aufgaben:
➥ Erzeugen eines Server-Objekts
➥ Registrieren des Objekts beim Namensdienst
➥
unter einem festgelegten, öffentlichen Namen
➥ Typischerweise keine neue Klasse, sondern main-Methode der
Server-Klasse
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
52
1.4.1 Hello World mit Java RMI ...
Hello-World Server (2)
public static void main(String args[]) {
try {
HelloServer obj = new HelloServer();
Naming.rebind("rmi://localhost/Hello−Server", obj);
}
catch (Exception e) {
System.out.println("Error: " + e.getMessage());
e.printStackTrace();
}
Registrieren des Server−Objekts
Erzeugen
des
}
unter dem Namen "Hello−Server"
Server−Objekts
}
beim Name−Server (RMI−Registry,
lokaler Rechner, Port 1099)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
53
1.4.1 Hello World mit Java RMI ...
Entwicklung der Client-Anwendung mit Aufrufen des
Server-Objekts
➥ Client muß sich zunächst beim Namensdienst über den Namen
eine Referenz auf das Server-Objekt holen
➥ Type cast auf den korrekten Typ erforderlich
➥ Dann: beliebige Methodenaufrufe möglich
➥ syntaktisch kein Unterschied zu lokalen Aufrufen
➥ Anmerkung: Client kann Remote-Referenzen auch auf anderen
Wegen erhalten
➥ z.B. als Rückgabewert einer Remote-Methode
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
54
1.4.1 Hello World mit Java RMI ...
Hello-World Client
import java.rmi.*;
public class HelloClient {
public static void main(String args[]) {
Objektreferenz vom
try {
Name−Server holen
Hello obj =
(Hello)Naming.lookup("rmi://bspc02/Hello−Server");
String message = obj.sayHello();
System.out.println(message);
}
Aufruf der Methode
catch (Exception e) {
des entfernten Objekts
...
}
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
55
1.4.1 Hello World mit Java RMI ...
Übersetzen und Starten des Systems
➥ Übersetzen der Java-Quellen
➥ Quelldateien: Hello.java, HelloServer.java,
HelloClient.java
➥ Aufruf: javac *.java
➥ erzeugt: Hello.class, HelloServer.class,
HelloClient.class
➥ Erzeugen des Client-Stubs (Proxy-Objekt)
➥ für Clients bis JDK 1.4:
➥
➥
Aufruf: rmic -v1.2 HelloServer
erzeugt HelloServer Stub.class
➥ ab JDK 1.5: Client erzeugt Proxy-Klasse zur Laufzeit
➥
durch java.lang.reflect.Proxy
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
56
1.4.1 Hello World mit Java RMI ...
Übersetzen und Starten des Systems ...
HelloClient.java
Hello.java
javac
Client−Seite
Roland Wismüller
Betriebssysteme / verteilte Systeme
Hello.class
javac
Hello.class
bis JDK 1.4
HelloClient.class
HelloServer.java
rmic
HelloServer.class
Server−Seite
HelloServer_Stub.class
Client/Server-Programmierung (2/15)
57
1.4.1 Hello World mit Java RMI ...
Übersetzen und Starten des Systems ...
➥ Starten des Namensdienstes
➥ Aufruf: rmiregistry [port]
➥ erlaubt aus Sicherheitsgründen nur die Registrierung von
Objekten auf dem lokalen Host
➥ d.h. RMI-Registry muß auf Server-Rechner laufen
➥ Standard-Port: 1099
➥ Starten des Servers
➥ Aufruf: java HelloServer
➥ Starten des Clients
➥ Aufruf: java HelloClient
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
58
1.4 Java RMI ...
1.4.2 Parameterübergabe
➥ Übergabe von Parametern an Remote-Methoden erfolgt
➥ entweder über call-by-value
➥
für Werttypen und serialisierbare Objekte
➥ oder über call-by-reference
➥
für Objekte, die Remote implementieren
➥ Entscheidung wird z.T. erst zur Laufzeit getroffen!
➥ Rückgabe des Ergebnisses folgt selben Regeln wie Parameterübergabe
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
59
1.4.2 Parameterübergabe ...
Übergabe eines serialisierbaren Objekts
Original
Client−
Objekt
param
Stub−
Objekt
op(param)
Server−
Objekt
Skele−
ton
param
serialisieren
Netz−
verbindung
unabhängige
Kopie
param
deserialisieren
<<create>>
param
op(param)
m()
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (2/15)
60
1.4.2 Parameterübergabe ...
Übergabe eines Remote-Objekts
Client−
Objekt
param
param
Stub
Stub−
Objekt
Skele−
ton
Server−
Objekt
op(param)
toStub(param)
paramStub
paramStub
serialisieren
Netz−
verbindung
Roland Wismüller
Betriebssysteme / verteilte Systeme
paramStub
deserialisieren
<<create>>
param
Stub
op(paramStub)
m()
Client/Server-Programmierung (2/15)
61
Client/Server-Programmierung
WS 2014/2015
17.10.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
iii
Client/Server-Programmierung
WS 2014/2015
2
Java Database Connectivity (JDBC)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
62
2 Java Database Connectivity (JDBC) ...
2.1 Überblick
➥ Java-API zum portablen Zugriff auf relationale DatenbankSysteme
➥ Unabhängig von konkreter Datenbank-Implementierung
➥ Funktionen:
➥ Verbindung zur Datenbank herstellen
➥ Ausführung von SQL-Anweisungen
➥ Zugriff auf Abfrage-Ergebnisse
➥ Vergleichbar mit ODBC, aber einfachere Schnittstelle
➥ Anschluß zur Datenbank über herstellerspezifische Treiber
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
63
2 Java Database Connectivity (JDBC) ...
2.2 Relationale Datenbanken und SQL
➥ Relationale Datenbank = Menge von Tabellen
➥ jede Spalte hat Namen und Datentyp
➥ jede Zeile enthält i.a. ein Feld, dessen Wert die Zeile eindeutig
identifiziert (Primärschlüssel)
➥ Aufbau festgelegt in Datenbank-Schema
➥ Beispiel:
ag_name
ag_data
AG_ID AG_NAME
ID AG_ID DAY VALUE
1
2
3
BMW
Siemens
Thyssen
Roland Wismüller
Betriebssysteme / verteilte Systeme
7
9
12
3
1
2
9
9
8
102.30
99.10
30.45
Client/Server-Programmierung (3/15)
Primär−
schlüssel
64
2.2 Relationale Datenbanken und SQL ...
SQL
➥ Standardisierte Abfragesprache für relationale Datenbanken
➥ Erlaubt u.a.:
➥ Abfrage von Daten (SELECT)
➥ Erzeugung neuer Tabellen (CREATE TABLE)
➥ Einfügen von Datensätzen (Zeilen) (INSERT)
➥ Löschen von Datensätzen (DELETE)
➥ Ändern von Datensätzen (UPDATE)
➥ Auswahl der Datensätze i.d.R. über deren Inhalt
➥ häufig über Primärschlüssel
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
65
2.2 Relationale Datenbanken und SQL ...
Beispiele für SQL-Anfragen
➥ SELECT AG_ID, AG_NAME
FROM ag_name
WHERE AG_NAME = ’Siemens’
➥ liefert die Zeile für Siemens aus der ag name-Tabelle
➥ SELECT ag_name.AG_NAME, ag_data.VALUE
FROM ag_name, ag_data
WHERE VALUE > 90 AND ag_name.AG_ID = ag_data.AG_ID
➥ liefert Name und Kurs aller Aktien mit Kurs über 90
➥ gibt Information aus zwei Tabellen zurück
➥
Verbindung der Einträge über den Primärschlüssel
(Natural Join)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
66
2 Java Database Connectivity (JDBC) ...
2.3 Architektur von JDBC
Java Anwendung
JDCB Treiber Manager
JDBC/ODBC
Brücke
Treiber für
mySQL
Treiber für
Oracle
ODBC
Treiber
MS
SQL−Server
Roland Wismüller
Betriebssysteme / verteilte Systeme
mySQL
Oracle
Client/Server-Programmierung (3/15)
67
2.3 Architektur von JDBC ...
Klassen des JDBC-Kerns
java.sql
<<interface>>
Statement
<<interface>>
ResultSet
DriverManager
<<interface>>
PreparedStatement
<<interface>>
ResultSetMetaData
DriverPropertyInfo
<<interface>>
CallableStatement
<<interface>>
Driver
<<interface>>
Connection
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
68
2.3 Architektur von JDBC ...
Klassen des JDBC-Kerns ...
➥ Interface Driver
➥ Schnittstelle, die alle JDBC-Treiber implementieren müssen
➥ neu geladener Treiber registriert sich bei DriverManager
➥ Klasse DriverManager
➥ verwaltet Driver-Objekte
➥ erzeugt Datenbank-Verbindungen (Connection)
➥ Klasse DriverPropertyInfo
➥ erlaubt Definition spezieller Parameter beim Aufbau der
Datenbank-Verbindung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
69
2.3 Architektur von JDBC ...
Klassen des JDBC-Kerns ...
➥ Interface Connection
➥ repräsentiert Sitzung mit ausgewählter Datenbank
➥ erlaubt Erzeugung von Statement-Objekten
➥ verwaltet Informationen zum Zustand der Datenbank
➥ erlaubt Abfrage von Metadaten der Datenbank
(Methode getMetaData(), Resultat: DatabaseMetaData)
➥
z.B. unterstützte SQL-Versionen, Limitierungen des
Datenbank-Systems, ...
➥ Interface Statement
➥ zur Ausführung einer SQL-Anfrage
➥ verwaltet auch Ergebnis der Anfrage (ResultSet)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
70
2.3 Architektur von JDBC ...
Klassen des JDBC-Kerns ...
➥ Interface PreparedStatement
➥ zur Ausführung einer vorkompilierten SQL-Anfrage
➥ effizienter bei wiederholter Ausführung
➥ Interface CallableStatement
➥ erlaubt Aufruf von Stored Procedures
➥
SQL-Prozeduren, die in Datenbank selbst abgelegt sind
➥ Interface ResultSet
➥ Ergebnis-Relation einer Datenbank-Anfrage
➥ Interface ResultSetMetaData
➥ Metadaten zu den Spalten der Ergebnis-Relation
➥ z.B. Name, Typ, vorzeichenbehaftet, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
71
2 Java Database Connectivity (JDBC) ...
2.4 Ein Beispiel
import java.sql.*;
import java.lang.*;
public class Beispiel {
public static void main(String[] args) {
try {
// Laden des JDBC−Treibers
Class.forName("com.mysql.jdbc.Driver");
}
catch (ClassNotFoundException e) {
System.out.println("Treiber nicht ladbar:" + e);
return;
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
72
2.4 Ein Beispiel ...
try {
// Verbindung zur Datenbank
Connection con = DriverManager.getConnection(
"jdbc:mysql://bslabserv01.lab.bvs/cspdb","","");
// Erzeuge SQL−Anweisung und führe sie aus
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT AG_ID, AG_NAME FROM ag_name");
// Ausgabe des Ergebnisses
while (rs.next()) {
System.out.println("" + rs.getInt("AG_ID") + ", "
+ rs.getString("AG_NAME"));
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
73
2.4 Ein Beispiel ...
// Alles schließen
rs.close();
stmt.close();
con.close();
}
catch (SQLException e) {
System.out.println("SQL Exception: "
+ e.getMessage());
e.printStackTrace(System.out);
}
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
74
2 Java Database Connectivity (JDBC) ...
2.5 Details zu JDBC
Laden der Treiber
➥ Vor Verwendung von JDBC müssen die Treiber geladen werden:
➥ try {
Class.forName("com.mysql.jdbc.Driver");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch (ClassNotFoundException e) { ... }
➥ Alternativ: Setzen der jdbc.drivers Property
➥ java -Djdbc.drivers=com.mysql.jdbc.Driver:sun.jdbc.
odbc.JdbcOdbcDriver ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
75
2.5 Details zu JDBC ...
Verbindung zur Datenbank herstellen
➥ Verbindung wird durch Connection-Objekt repräsentiert
➥ Mehrere Datenbank-Verbindungen pro Anwendung möglich
➥ Erzeugung über
➥ Connection con = DriverManager.getConnection(
"url ", "user ", "password ");
➥ Variante von getConnection() erlaubt Definition von Properties
für die Datenbank-Verbindung
➥ Wenn Verbindung nicht mehr benötigt wird:
➥ explizites Schließen mit Methode con.close()
➥
Freigabe von Netzwerk- und Speicherressourcen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
76
2.5 Details zu JDBC ...
Ausführung einer SQL-Anweisung
➥ Erzeugung eines Statement-Objekts
➥ Statement stmt = con.createStatement();
➥ Ausführung der SQL-Anweisung
➥ ResultSet rs = stmt.executeQuery("SELECT ...");
➥ Methoden executeUpdate() für Anfragen ohne Ergebnis,
bzw. execute(), falls unbekannt, ob Ergebnis geliefert wird
➥ execute() liefert true, falls Ergebnis vorhanden
➥ Statement-Objekt repräsentiert eine einzige SQL-Anfrage
➥ ResultSet wird bei erneuter Anfrage über selbes
Statement-Objekt ungültig
➥ für simultane Anfragen: mehrere Statement-Objekte!
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
77
2.5 Details zu JDBC ...
Zugriff auf die Resultate
➥ Ergebnis einer SQL-Anfrage (SELECT) ist eine Tabelle
➥ Struktur gekapselt in ResultSet-Objekt
➥ Methoden u.a.:
➥ next(): setzt Lesezeiger“ auf nächste Zeile
➥
➥
”
zu Begin steht Zeiger vor der ersten Zeile
Ergebnis false, falls keine Zeile mehr vorhanden
➥ get...(String name) / get...(int nr): liefert Inhalt des
Feldes mit Spaltenname name bzw. Spaltennummer nr
➥ mehrere Methoden für die verschiedenen Datentypen
➥ getString() liefert immer String-Repräsentation
➥ close(): Ressourcenfreigabe
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
78
2.5 Details zu JDBC ...
SQL-Datentypen und Zugriffsmethoden (Auswahl)
SQL Typ(en)
CHAR, VARCHAR
NUMERIC, DECIMAL
BIT
TINYINT
SMALLINT
INTEGER
BIGINT
REAL
FLOAT, DOUBLE
BINARY, VARBINARY
DATE
Roland Wismüller
Betriebssysteme / verteilte Systeme
Java Typ
String
java.math.BigDecimal
boolean
byte
short
int
long
float
double
byte[]
java.sql.Date
Methode
getString()
getBigDecimal()
getBoolean()
getByte()
getShort()
getInt()
getLong()
getFloat()
getDouble()
getBytes()
getDate()
Client/Server-Programmierung (3/15)
79
2.5 Details zu JDBC ...
Ausführung vorkompilierter SQL-Anfragen
➥ Für wiederkehrende, ähnliche Aufgaben sind vorkompilierte
SQL-Anfragen (PreparedStatement) effizienter
➥ die Anfragen sind auch parametrisierbar
➥ Auch Sicherheitsvorteil gegen SQL Injection
➥ Erzeugung eines PreparedStatement-Objekts
➥ PreparedStatement stmt = con.prepareStatement(
"INSERT INTO Employees (Name, Phone) (?, ?)");
➥ ? als Platzhalter für Parameter
➥ Ausführung der Anfrage mit konkreten Parametern
➥ stmt.clearParameters();
stmt.setString(1, "Jimmy Dean"); // erster Param.
stmt.setString(2, "201 555-7685"); // zweiter Param.
stmt.executeUpdate();
// kein Ergebnis
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
80
2.5 Details zu JDBC ...
Ausführung von Stored Procedures
Oracle PL/SQL−Prozedur (Im
Datenbanksystem gespeichert)
CREATE OR REPLACE
PROCEDURE sp_interest
(id IN INTEGER
bal IN OUT FLOAT) is
BEGIN
SELECT balance
INTO bal
FROM accounts
WHERE account_id = id;
bal = bal + bal * 0.03;
UPDATE accounts
SET balance = bal
WHERE account_id = id;
END;
Roland Wismüller
Betriebssysteme / verteilte Systeme
Aufruf der Prozedur über JDBC
CallableStatement stmt
= con.prepareCall(
"{call sp_interest(?,?)}");
stmt.registerOutParameter(2,
Types.FLOAT);
stmt.setInt(1, accountID);
stmt.setFloat(2, 2343.23);
stmt.execute();
out.println("New Balance: "
+ stmt.getFloat(2));
Client/Server-Programmierung (3/15)
81
2.5 Details zu JDBC ...
Transaktionen
➥ Verantwortlich für Transaktionen: Connection-Objekt
➥ Methoden zur Steuerung von Transaktionen:
➥ setAutoCommit() - automatisches Festschreiben?
➥ Voreinstellung: jede SQL-Anweisung wird als individuelle
Transaktion ausgeführt
➥ commit() - Festschreiben der Transaktion
➥ rollback() - Abbruch der Transaktion
➥ setTransactionIsolation() - Isolationsebene festlegen
➥ TRANSACTION NONE, sowie die vier Isolations-Ebenen nach
ANSI/ISO-SQL99 (☞ VS, 7.4):
➥ read uncommitted, read commited, repeatable read,
serializable
➥ Voreinstellung ist vom Treiber abhängig
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
82
2.5 Details zu JDBC ...
Transaktionen ...
try {
// Höchste Isolationsebene
con.setTransactionIsolation(TRANSACTION_SERIALIZABLE);
// Transaktionen mit mehreren SQL−Anweisungen zulassen
con.setAutoCommit(false);
// SQL−Anweisungen
stmt.executeUpdate("UPDATE inv SET onhand = 10 WHERE id = 5");
stmt.executeUpdate("INSERT INTO shipping (qty) VALUES (5)");
// Commit aller Aktionen seit letztem Commit/Rollback
con.commit();
}
catch (SQLException e) {
// Rückgängigmachen aller Änderungen
con.rollback();
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
83
2 Java Database Connectivity (JDBC) ...
2.6 Zusammenfassung
➥ JDBC erlaubt portablen Zugriff auf relationale Datenbanken
➥ Abfragen über SQL
➥ Grundsätzlicher Ablauf:
➥ Laden des Treibers (Class.forName())
➥ Verbindung zur Datenbank herstellen (Connection)
➥ SQL-Anweisung erzeugen (Statement)
➥ SQL-Anweisung ausführen, Ergebnis auslesen (ResultSet)
➥ Daneben: Unterstützung für
➥ vorkompilierte SQL-Anweisungen und Stored Procedures
➥ Transaktionen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
84
Client/Server-Programmierung
WS 2014/2015
3
CORBA
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
85
3 CORBA ...
Inhalt
➥ CORBA-Architektur
➥ CORBA-Dienste
➥ Beispielprogramm
➥ CORBA im Detail
➥ IDL und IDL-Java-Mapping
➥ Namensdienst
➥ POA
➥ GIOP, IIOP und IOR
➥ Implementation- und Interface-Repository
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
86
3 CORBA ...
Literatur
➥ CORBA-Spezifikationen der OMG
➥ http://www.omg.org/technology/documents/
corba spec catalog.htm
➥ Farley / Crawford / Flanagan, Kap. 14
➥ Orfali / Harkey, Kap. 1, 4, 7-9, 17-22
➥ Hofmann / Jobst / Schabenberger, Kap. 2.2, 5, 6
➥ Michi Henning, Steve Vinoski: Advanced CORBA Programming
with C++. Addison-Wesley, 1999.
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
87
3.1 Einführung
➥ CORBA: Common Object Request Broker Architecture
➥ Ziel: Entwicklung und Integration verteilter objektorientierter
Anwendungen in heterogenen Umgebungen
➥ CORBA ist plattform- und sprachunabhängig
➥ Informeller Standard, definiert durch die OMG (Object
Management Group)
➥ 1989 gegründet, Ziel: Förderung objektorientierter Techniken
➥ heute über 700 Mitglieder (größtes IT-Industriekonsortium)
➥ CORBA ist nur eine Spezifikation
➥ verschiedenste Implementierungen, z.B. Orbix, ORB ACUS,
Java IDL (Teil des JDK), JacORB, ORBit (GNOME!) ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
88
3.2 CORBA Architektur
3.2.1 Object Management Architecture (OMA)
➥ Definiert Objekt- und Referenzmodell
➥ Objektmodell
➥ unterstützt Kapselung, (Mehrfach-)Vererbung, Polymorphie
➥ Objekte bieten Dienste mit definierter Schnittstelle an
➥ Client nutzt Dienste (lokal oder entfernt) über Schnittstelle, ist
vollständig von Server-Implementierung unabhängig
➥ Objektimplementierung mit beliebiger Programmiersprache
➥ Referenzmodell
➥ Interaktion zw. Objekten und dazu notwendige Komponenten
➥ Herzstück: Object Request Broker (ORB)
➥
Software-Bus“ für Kommunikation zw. Client und Server
”
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
89
3.2.1 Object Management Architecture (OMA) ...
Das OMA Referenzmodell
Application
Objects
Vertical CORBA
Facilities
Horizontal CORBA
Facilities
Client Server
Object Request Broker
...
Naming
Event
LifeCycle
Transactions
CORBA Services
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
90
3.2.1 Object Management Architecture (OMA) ...
Bestandteile des OMA Referenzmodells
➥ Object Request Broker (ORB)
➥ stellt Dienstanfragen an verteilte Objekte zu
➥ realisiert Ortstransparenz für die Client-Objekte
➥ CORBA Services (Object Services)
➥ domänenunabhängige (horizontale) Schnittstellen zu
wichtigen Basisdiensten, z.B. Namensdienst
➥ betriebssystem-ähnliche Funktion
➥ Horizontal CORBA Facilities (Common Facilities)
➥ Schnittstellen zu anwendungsorientierten, domänenüber-
greifenden Diensten
➥ z.B. Drucken, verteilte Dokumente, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
91
3.2.1 Object Management Architecture (OMA) ...
Bestandteile des OMA Referenzmodells ...
➥ Vertical CORBA Facilities (Domain Interfaces)
➥ Schnittstellen zu anwendungsorientierten Diensten für
bestimmte Anwendungsdomänen
➥
z.B. Finanzwesen, Medizin, Telekommunikation, ...
➥ Application Objects
➥ anwendungsspezifische Schnittstellen
➥ im Ggs. zu Services und Facilities nicht von der OMG
standardisiert
➥ OMG spezifiziert nur die Schnittstellen, nicht die Implementierungen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
92
3.2 CORBA Architektur ...
3.2.2 Common Object Request Broker Architecture (CORBA)
➥ Zentrale Idee: transparente Kommunikation zwischen Client und
Server-Objekten über ORB
➥ ORB bietet Client eine lokale (Proxy-)Schnittstelle
➥ Vorteile beim Einsatz eines ORB:
➥ Zugriffs- und Ortstransparenz
➥ Transparenz der Implementierungssprache
➥ Transparenz der Objektaktivierung
➥
ORB übernimmt ggf. Aktivierung des Objekts
➥ Transparenz der Kommunikationstechnik
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
93
3.2.2 Common Object Request Broker Arch. ...
Objektreferenzen
➥ Zugriff auf Objekte erfolgt über Objektreferenzen
➥ Objektreferenzen
➥ identifizieren genau ein Objekt
➥
aber: verschiedene Referenzen für ein Objekt möglich
➥ können null sein, d.h. auf kein Objekt zeigen
➥ können hängen“, wenn Objekt nicht mehr existiert
”
➥ können persistent sein
➥ sind typsicher
➥ unterstützen spätes Binden (Polymorphismus)
➥ sind interoperabel, d.h. Aufbau ist standardisiert
➥ sind opak, d.h. Client darf Inhalt nicht betrachten
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
94
3.2.2 Common Object Request Broker Arch. ...
OMG Interface Definition Language (OMG IDL)
➥ OMG IDL erlaubt formale Beschreibung der Objekt-Schnittstellen
➥ unabhängig von Implementierung der Objekte (z.B.
Programmiersprache)
➥ Objekte können z.B. durch C++- oder Java-Objekte, aber auch
durch eigene Programme oder OO-Datenbanken
implementiert werden
➥ OMG definiert, wie IDL in verschiedene Sprachen abgebildet wird
(Language Mapping)
➥ derzeit für C, C++, Java, Smalltalk, Ada, Lisp, Phyton, Cobol,
PL/1, Ruby
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (3/15)
95
Client/Server-Programmierung
WS 2014/2015
24.10.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
iv
3.2.2 Common Object Request Broker Arch. ...
Modell des Object Request Brokers
Client
Object Implementation
111111 1111
000000
0000
00000
11111
000000000
111111111
00000
11111
0000
1111
0000
1111
00000
11111
00000 1111
11111
0000
000000
111111
000000000
111111111
Stub
Dynamic
Invocation
Interface
ORB
Interface
Skeleton
Dynamic
Skeleton
Interface
Object
Adapter
ORB−Core
Interface Repository
Implementation Repository
00Identische Schnittstelle für alle ORB−Implementierungen
11
111
000
Eine Schnittstelle pro Objekt−Typ
11Mehrere (unterschiedliche) Objekt−Adapter möglich
00
ORB−spezifische Schnittstelle
Roland Wismüller
Betriebssysteme / verteilte Systeme
mögliche
Rechnergrenze
Client/Server-Programmierung (4/15)
96
3.2.2 Common Object Request Broker Arch. ...
Komponenten des ORB
➥ ORB Core
➥ stellt Basisfunktionalität zur Verfügung
➥
Objekt-Repräsentation, Kommunikationsmechanismen
➥ ist i.d.R. verteilt implementiert
➥ Stub und Skeleton
➥ für entfernten Methodenaufruf
➥ vom IDL-Compiler aus Schnittstellendefinition erzeugt
➥ Dynamic Invocation Interface und Dynamic Skeleton Interface
➥ erlauben dynamische Methodenaufrufe/-implementierungen
➥ d.h. Schnittstelle muß zur Übersetzungszeit des Clients bzw.
Servers noch nicht festgelegt sein
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
97
3.2.2 Common Object Request Broker Arch. ...
Komponenten des ORB ...
➥ Object Adapter
➥ stellt Objektimplementierung Dienste des ORB zur Verfügung
➥ Funktionen u.a.:
➥
➥
➥
➥
➥
Methodenaufrufe (über Skeletons)
Abbildung von Referenzen auf Impementierungen
Registrierung von Implementierungen
Generierung und Interpretation von Objektreferenzen
Objektaktivierung und -deaktivierung
➥ unterschiedliche Objektadapter möglich
➥ ab CORBA 2.2: Portable Object Adapter (POA) als
Standard-Schnittstelle zum Objektadapter
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
98
3.2.2 Common Object Request Broker Arch. ...
Komponenten des ORB ...
➥ ORB Interface
➥ Schnittstelle für Dienste, die der ORB dem Client und allen
Objektimplementierungen zur Verfügung stellt
➥ Interface Repository
➥ Dienst, der zur Laufzeit persistente Information zu den
registrierten Objektschnittstellen zur Verfügung stellt
➥ Nutzung ggf. durch ORB und / oder Clients
➥ allgemein: jegliche Information zu Objekt-Schnittstellen
➥ Implementation Repository
➥ enthält Information, die es dem ORB erlaubt, Objekte zu
lokalisieren und zu aktivieren
➥ allgemein: jegliche Information zu Objekt-Implementierungen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
99
3.2 CORBA Architektur ...
3.2.3 CORBA-Dienste
➥ Von der OMG spezifiziert, erweitern ORB-Funktionalität
➥ realisiert durch CORBA-Objekte mit IDL-Schnittstelle
➥ Anbieter von ORB und Diensten können unterschiedlich sein
➥ Collection Service
➥ Container -Objekte, z.B. Map, Set, Queue
➥ Concurrency Control Service
➥ realisiert Sperren für wechselseitigen Ausschluß
➥ Event Service
➥ verteilt Ereignisse an interessierte Objekte
➥ Externalization Service
➥ (De-)Serialisierung von Objekten
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
100
3.2.3 CORBA-Dienste ...
➥ Licensing Service
➥ erfaßt Nutzung von Objekten für Abrechnung
➥ Life Cycle Service
➥ Erzeugen, Löschen, Kopieren und Verschieben von Objekten
➥ Naming Service
➥ Zuordnung von Namen zu Objektreferenzen
➥ Notification Service
➥ Event Service-Erweiterung: beliebige Daten als Ereignisse
➥ Persistent Object Service
➥ persistentes Speichern von Objekten in Datenbanken
➥ Property Service
➥ Verwaltet Name/Wert-Paare
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
101
3.2.3 CORBA-Dienste ...
➥ Query Service
➥ Anfrageoperationen an verteilte Objekte (SQL-Obermenge)
➥ Relationship Service
➥ Erzeugung / Traversierung von Assoziationen zw. Objekten
➥ Security Service
➥ Authentifizierung, Zugriffskontroll-Listen, Rechteweitergabe
➥ Time Service
➥ Zeit-Synchronisation
➥ Trading Service
➥ erlaubt CORBA-Objekte anhand ihrer Fähigkeiten zu finden
➥ Object Transaction Service
➥ flache und verschachtelte verteilte Transaktionen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
102
3.3 Hello World mit CORBA
Vorbemerkungen
➥ In der Vorlesung und Übung:
Verwendung zweier CORBA-Implementierungen
➥ Java IDL
➥
➥
Seit JDK 1.2 fester Bestandteil der Java Entwicklungsumgebung
wenig Dienste (nur Namensdienst)
➥ JacORB 2.3.1
➥
➥
frei verfügbarer ORB, in Java implementiert
mehr Dienste (u.a. Naming, Event, Notification, Transaction, Trading), sowie Interface- und Implementation Repository
➥ Wegen POA: Anwendungs-Quellcode ist für alle Implementierungen gleich
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
103
Vorgehen zur Erstellung der Anwendung
3.3 Hello World mit CORBA ...
Schnittstellen− 1
definitionen in IDL
5 IDL−zu−Java
Compiler
Java
Interfaces
6
Client−
Code
Client−
Stubs
Client Server
Hilfs−
Klassen
7
javac
Compiler
Client−
Anwendung
Stub
Java
Interfaces
4
IDL−zu−Java 2
Compiler
Objekt−
Skeletons POA
javac
Compiler
Hilfs−
Klassen
Objekt− 3
Impl.code
Objekt−
Implementierung
Skeleton POA
Object Request Broker
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
104
3.3 Hello World mit CORBA ...
IDL-Beschreibung der Schnittstelle
module HelloWorld
Paketname
{
interface Hello Schnittstelle
{
string sayHello(in string name); Methode
};
};
Eingabeparameter
➥ CORBA definiert eigene, C++/Java-ähnliche Sprache
➥ IDL-Compiler erzeugt Schnittstellen für jeweilige Implementierungssprache
➥ kann für Client und Server verschieden sein
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
105
3.3 Hello World mit CORBA ...
Vom IDL-Compiler generierte Dateien
Hello.idl
idlj (Java IDL)
idl (JacOrb)
Client
_HelloStub.java
Client−Stub
Hello.java
Roland Wismüller
Betriebssysteme / verteilte Systeme
HelloPOA.java
HelloOperations.java
HelloPOATie.java
HelloHelper.java
POA (Tie−Klasse)
Schnittstelle
Hilfsfunktionen
für Client/Server
Server
POA (Basisklasse)
HelloHolder.java
Hilfsklasse für
Ausgabeparameter
Client/Server-Programmierung (4/15)
106
3.3 Hello World mit CORBA ...
Aufruf des IDL-Compilers
➥ Java IDL:
➥ idlj -fall – erzeugt alle Dateien
➥ idlj -fclient – erzeugt Dateien für Client
➥ idlj -fserver – erzeugt Dateien für Server
➥
ohne Helper-Klassen!
➥ idlj -fallTie – erzeugt alle Dateien incl. Tie-Klassen
➥ JacORB:
➥ idl – erzeugt alle Dateien incl. Tie-Klassen
➥ idl -noskel – erzeugt Dateien nur für Client
➥ idl -nostub – erzeugt Dateien nur für Server
➥ Weiteres Argument: Name der IDL-Datei
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
107
3.3 Hello World mit CORBA ...
Vom IDL-Compiler erzeugte Java-Schnittstelle
➥ HelloWorld/Hello.java:
package HelloWorld;
public interface Hello extends HelloOperations,
org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity
{
}
➥ HelloWorld/HelloOperations.java:
package HelloWorld;
public interface HelloOperations
{
String sayHello (String name);
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
108
3.3 Hello World mit CORBA ...
Objektimplementierung
// vom IDL−Compiler erzeuges Paket mit POA/Skeleton etc.
import HelloWorld.*;
public class HelloImpl extends HelloPOA
{
public String sayHello(String name)
{
return "The world says HELLO to " + name;
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
109
3.3 Hello World mit CORBA ...
Server-Programm
// vom IDL−Compiler erzeuges Paket mit Hilfsklassen
import HelloWorld.*;
// CORBA Namensdienst
import org.omg.CosNaming.*;
// Für Exceptions, die Namensdienst werfen kann
import org.omg.CosNaming.NamingContextPackage.*;
// Alle CORBA−Server benötigen diese Klassen
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
110
3.3 Hello World mit CORBA ...
public class HelloServer {
public static void main(String args[]) {
try {
// Erzeuge und Initialisiere den ORB
ORB orb = ORB.init(args, null);
// Erzeuge das Servant−Objekt
HelloImpl helloRef = new HelloImpl();
// Aktivierung des POA
POA rootpoa = POAHelper.narrow(
orb.resolve_initial_references("RootPOA"));
rootpoa.the_POAManager().activate();
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
111
3.3 Hello World mit CORBA ...
// Registriere Servant und erzeuge (CORBA) Objektreferenz
org.omg.CORBA.Object ref =
rootpoa.servant_to_reference(helloRef);
// Konvertierung in Java−Objektreferenz
Hello href = HelloHelper.narrow(ref);
// Registriere Objektreferenz beim Namensdienst
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContextExt ncRef =
NamingContextExtHelper.narrow(objRef);
NameComponent path[] = ncRef.to_name("HelloWorld");
ncRef.rebind(path, href);
System.out.println("HelloServer is running...");
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
112
3.3 Hello World mit CORBA ...
// Starte ORB
orb.run();
} catch(Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
113
3.3 Hello World mit CORBA ...
Client-Programm
import HelloWorld.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
// Client Stubs
// Namensdienst
// CORBA Klassen
public class HelloClient {
public static void main(String args[]) {
try {
// Erzeuge und Initialisiere den ORB
ORB orb = ORB.init(args, null);
// Aufsuchen des Objekts beim Namensdienst
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
114
3.3 Hello World mit CORBA ...
NamingContextExt ncRef =
NamingContextExtHelper.narrow(objRef);
NameComponent path[] = ncRef.to_name("HelloWorld");
Hello helloRef =
HelloHelper.narrow(ncRef.resolve(path));
// Aufruf der Methode des CORBA−Objekts
System.out.println(helloRef.sayHello("Peter"));
} catch(Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
115
3.3 Hello World mit CORBA ...
Anmerkungen zum Code
➥ resolve initial references() dient der initialen Auflösung von
Namen, insbesondere:
➥ RootPOA: der Wurzel-POA des Servers (☞ 3.4.6)
➥ NameService: der Namensdienst
Ergebnis ist org.omg.CORBA.Object
➥ CORBA Objektreferenz
➥ narrow() dient zum Umwandeln einer CORBA-Objektreferenz in
eine Java Objektreferenz (des Stubs)
➥ to name() wandelt String in strukturierten Namen für Namensdienst um (s. später)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
116
3.3 Hello World mit CORBA ...
Starten der Anwendung (Java IDL)
➥ Starten des ORB-Daemons (Namensdienst)
➥ orbd -ORBInitialPort 12345 [ -port <port> ]
➥ startet Daemon auf Port 12345 (-port legt Port für
Objektaktivierung fest)
➥ Achtung: ~/orb.properties von JacORB darf nicht existieren!
➥ Starten des Servers
➥ java HelloServer -ORBInitialPort 12345
[ -ORBInitialHost <addr> ]
➥ Angabe von Host und Port des ORB-Daemons
➥ Starten des Clients
➥ java HelloClient -ORBInitialPort 12345
[ -ORBInitialHost <addr> ]
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
117
3.3 Hello World mit CORBA ...
Zur Nutzung von JacORB im Labor H-A 4111
➥ Umgebungsvariablen setzen (ggf. in $HOME/.profile):
➥ export JACORB_HOME=/opt/dist/JacORB
➥ export PATH=$JACORB_HOME/bin:$PATH
➥ Konfigurationsdatei einrichten:
➥ cp $JACORB_HOME/etc/jacorb_properties.template
$HOME/orb.properties
➥ in $HOME/orb.properties alle cspXXX durch eigenes Login
ersetzen
➥ JacORB verwendet bei uns eine Datei unter $HOME zum
Auflösen der initialen Referenzen
➥ setzt Netzwerk-Dateisystem (NFS) voraus
➥ auch möglich: Nutzung eines WWW-Servers
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
118
3.3 Hello World mit CORBA ...
Starten der Anwendung (JacORB)
➥ Starten des Namensdienstes
➥ ns
➥ startet auf beliebigem freiem Port
➥ schreibt eigene Objektreferenz in Datei $HOME/.jaco_ns
➥ Starten des Servers
➥ jaco HelloServer
➥ jaco ist ein Hilfsskript von JacORB
➥
startet JVM mit nötigen Properties und Classpath
➥ Starten des Clients
➥ jaco HelloClient
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
119
3.4 CORBA im Detail
3.4.1 OMG IDL und Java-Mapping
➥ Struktur einer IDL-Datei:
module Identifikator {
Typ-Deklarationen;
Konstanten-Deklarationen;
Exception-Deklarationen;
interface Identifikator [ :Vererbung ] {
Typ-Deklarationen;
Konstanten-Deklarationen;
Exception-Deklarationen;
Attribut-Deklarationen;
Methoden-Deklarationen;
};
...
};
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
120
3.4.1 OMG IDL und Java-Mapping ...
module und interface
➥ module definiert einen neuen Namensraum
➥ ähnlich wie C++ Namespaces bzw. Java Packages
➥ verschachtelte Namensräume möglich
➥ interface definiert neue Schnittstelle
➥ ähnlich wie Java-Schnittstellen
➥ Schnittstelle kann Methoden und Attribute enthalten
➥
Attribute werden über automatisch generierte
Deklarationen von Get- und Set-Methoden realisiert
➥ Vererbung ist möglich, auch Mehrfachvererbung
➥
vererbt werden nur Schnittstellen, keine Implementierungen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
121
3.4.1 OMG IDL und Java-Mapping ...
Methoden-Deklarationen
➥ Syntax:
➥ [ oneway ] Typ Identifikator ( Parameterliste )
[ raises ( Exceptions ) ] [ Kontext ]
➥ Parameterliste: Liste von Parameterdeklarationen:
➥
➥
{ in | out | inout } Typ Identifikator
Klassifikation nach Ein- und Ausgabeparametern
➥ Kontext: Liste von Kontextvariablen
➥
ähnlich UNIX Umgebungsvariablen, werden an Server
übergeben
➥ oneway: asynchroner Methodenaufruf
➥
ohne Ergebnis / Ausgabeparameter
➥ Überladen von Methoden ist nicht erlaubt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (4/15)
122
3.4.1 OMG IDL und Java-Mapping ...
Wichtige Basis-Datentypen und ihre Java-Entsprechungen
IDL Datentyp
[unsigned] short
[unsigned] long
[unsigned] long long
float
double
char
string
boolean (TRUE, FALSE)
octet
any
Roland Wismüller
Betriebssysteme / verteilte Systeme
Beschreibung
Ganzzahl, 16 Bit
Ganzzahl, 32 Bit
Ganzzahl, 64 Bit
Gleitkomma, 32 Bit
Gleitkomma, 64 Bit
Zeichen, 8 Bit
Zeichenkette
Boole’scher Wert
Byte
beliebiger Typ
Java Datentyp
short
int
long
float
double
char
String
boolean (true, false)
byte
org.omg.CORBA.Any
Client/Server-Programmierung (4/15)
123
Client/Server-Programmierung
WS 2014/2015
27.10.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
v
3.4.1 OMG IDL und Java-Mapping ...
Beispiel
module Beispiel {
interface Test1 {
void setName(in string name);
double getXY(out double y);
long encrypt(in string key, inout string msg);
};
interface Test2 {
string charToString(in char c1, in char c2);
};
};
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
124
3.4.1 OMG IDL und Java-Mapping ...
Vom IDL-Compiler erzeugte Klassen und Interfaces
Beispiel
<<interface>>
Test1Operations
setName()
getXY()
encrypt()
Test1Helper
narrow()
insert()
extract()
<<interface>>
Test2Operations
charToString()
Test1Holder
<<interface>>
Test1
<<interface>>
Test2
_Test1Stub
Roland Wismüller
Betriebssysteme / verteilte Systeme
Test2Helper
narrow()
insert()
extract()
Test2Holder
_Test2Stub
Client/Server-Programmierung (5/15)
125
3.4.1 OMG IDL und Java-Mapping ...
Erzeugte Java-Schnittstellen
➥ Beispiel/Test1Operations.java:
package Beispiel;
public interface Test1Operations {
void setName (String name);
double getXY (org.omg.CORBA.DoubleHolder y);
int encrypt (String key,
org.omg.CORBA.StringHolder msg);
}
➥ Beispiel/Test2Operations.java:
package Beispiel;
public interface Test2Operations {
String charToString (char c1, char c2);
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
126
3.4.1 OMG IDL und Java-Mapping ...
Holder-Klassen
➥ Java unterstützt keine Ausgabeparameter
➥ daher: Übergabe eines Objekts (per Referenz!), das den
Parameter enthält (Holder -Klasse)
➥ Z.B. Code für DoubleHolder:
public final class DoubleHolder ... {
public double value;
public DoubleHolder() {
}
public DoubleHolder(double initialValue)
value = initialValue;
}
...
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
127
3.4.1 OMG IDL und Java-Mapping ...
Helper-Klassen
➥ Hilfsmethoden für CORBA-Objekte
➥ Ausschließlich static-Methoden:
➥ narrow(): Typumwandlung (Down cast), wandelt u.a. CORBA
Objektreferenz in Java Objektreferenz um
➥ insert(): packt Objekt in Datentyp org.omg.CORBA.Any
➥ extract(): extrahiert Objekt aus org.omg.CORBA.Any
➥ id(): Schnittstellen-ID für Interface-Repository
➥ read(): Lesen eines Objekts aus einem Eingabestrom
➥ write(): Schreiben eines Objekts in einen Ausgabestrom
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
128
3.4.1 OMG IDL und Java-Mapping ...
Abgeleitete Datentypen
➥ OMG IDL erlaubt Definition abgeleiteter Datentypen
➥ Interfaces (Objekte)
➥ Sequenzen und Arrays
➥ Strukturen (Struct)
➥ Aufzählungen (Enum)
➥ Vereinigungen (Union)
➥ Daneben: Typdefinitionen (Typedefs)
➥ Syntax / Semantik stark an C/C++ angelehnt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
129
3.4.1 OMG IDL und Java-Mapping ...
Typdefinitionen (Typedefs)
➥ IDL erlaubt es, neue Namen für existierende Typen zu definieren
➥ auf allen Ebenen (global, Modul, Schnittstelle)
➥ Beispiele:
typedef short Temperatur; // neuer Typname: Temperatur
typedef Test2 MyTest;
➥ CORBA legt nicht fest, ob neuer Typname nur Alias für
existierenden Typ ist, oder ob neuer Typ erzeugt wird
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
130
3.4.1 OMG IDL und Java-Mapping ...
Sequenzen
➥ Vektoren (eindimensionale Felder) variabler Länge
➥ beliebige IDL-Elementtypen
➥ Länge kann begrenzt oder unbegrenzt sein
➥ Beispiel: IDL
typedef sequence<Dog> MySeq;
typedef sequence<Dog, 60> MyBoundedSeq;
void seqtest(in MySeq par1, in MyBoundedSeq par2,
out MySeq par3);
➥ Umsetzung in Java:
void seqtest(Beispiel.Dog[] par1, Beispiel.Dog[] par2,
Beispiel.Test2Package.MySeqHolder par3);
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
131
3.4.1 OMG IDL und Java-Mapping ...
Arrays
➥ Ein- oder mehrdimensionale Felder fester Länge
➥ Beispiel: IDL
typedef Dog MyArray[60];
typedef Dog My2DArray[60][10];
void arraytest(in MyArray par1, in My2DArray par2,
out MyArray par3);
➥ Umsetzung in Java:
void arraytest(Beispiel.Dog[] par1,
Beispiel.Dog[][] par2,
Beispiel.Test2Package.MyArrayHolder par3);
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
132
3.4.1 OMG IDL und Java-Mapping ...
Strukturen (Structs)
➥ Zusammenfassung von mehrerer Variablen
➥ entspricht Klasse mit public-Attributen ohne Methoden
➥ Beispiel: IDL
struct MyStruct {
short age;
string name;
};
Roland Wismüller
Betriebssysteme / verteilte Systeme
➥ Umsetzung in Java:
public final class MyStruct {
public short age = (short)0;
public String name = null;
public MyStruct() {}
public MyStruct(short _age,
String _name) {
age = _age; name = _name;
}
}
Client/Server-Programmierung (5/15)
133
3.4.1 OMG IDL und Java-Mapping ...
Aufzählungen (Enums)
➥ Neuer Typ mit explizit aufgezählten Werten
➥ Beispiel: IDL
enum Color { red, green, blue };
➥ Umsetzung in Java:
➥ Klasse Color mit
➥
➥
➥
static final-Attributen für die Werte
➥ als int-Wert (z.B. red) und als Color-Objekt (z.B. red)
Methode value(), liefert int-Wert zurück
static-Methode from int() als Factory
➥ Verwendung z.B.:
Color mycol = Color.red;
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
134
3.4.1 OMG IDL und Java-Mapping ...
Vereinigungen (Unions)
➥ Beschreibt Daten, die verschiedene Typen haben können
➥ Typ wird durch Diskriminator zur Laufzeit festgelegt
➥ Beispiel: IDL
union Animal switch (short) {
case 1: Dog dog;
case 2: Cat cat;
default: Mouse mouse;
};
➥ Umsetzung in Java: Klasse Animal mit
➥ Methode discriminator() für Diskriminator
➥ Get- und Set-Methoden für die Felder des Union
➥ prüfen bzw. setzen auch Diskriminator-Wert
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
135
3.4.1 OMG IDL und Java-Mapping ...
Attribute
➥ In einem Interface können auch Attribute definiert werden:
➥ attribute string name;
readonly attribute long age;
➥ deklariert werden damit letztendlich nur Zugriffsmethoden zum
Lesen und ggf. auch zum Schreiben
➥ Erzeugte Java-Schnittstelle im Beispiel:
String name ();
void name (String newName);
int age ();
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
136
3.4.1 OMG IDL und Java-Mapping ...
Konstanten
➥ Konstanten können auf globaler, auf Modul- oder auf
Interface-Ebene definiert werden
➥ unterschiedlicher Gültigkeitsbereich
➥ Beispiel zur Syntax:
interface Test2 {
const short maxItems = 40;
const string myName = "Roland";
...
➥ Abbildung nach Java:
public interface Test2 extends Test2Operations ... {
public static final short maxItems = (short)(40);
public static final String myName = "Roland";
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
137
3.4.1 OMG IDL und Java-Mapping ...
Exceptions
➥ IDL erlaubt Definition eigener Exceptions
➥ daneben: jede Methode kann (implizit) eine Reihe von
System-Exceptions werfen, z.B. Marshaling-Fehler
➥ Beispiel:
exception SyntaxError {
unsigned short position;
};
void parse(in string command) raises (SyntaxError);
➥ Umsetzung in Java:
void parse (String command)
throws Beispiel.Test2Package.SyntaxError;
➥ plus Exception-Klasse SyntaxError, analog zu Struct
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
138
3.4.1 OMG IDL und Java-Mapping ...
Vererbung
➥ Methoden und Attribute von Schnittstellen können vererbt werden
➥ auch Mehrfachvererbung möglich
➥ kein Überladen / Überschreiben von Methoden erlaubt
➥ Beispiel:
➥ Umsetzung in Java:
interface Animal {
attribute short age;
void eat(in string what);
};
interface Dog : Animal {
string bark();
};
Roland Wismüller
Betriebssysteme / verteilte Systeme
AnimalOperations
short age()
void age(short)
void eat(String)
DogOperations
String bark()
Animal
Client/Server-Programmierung (5/15)
Dog
139
3.4.1 OMG IDL und Java-Mapping ...
Vererbung ...
➥ Methoden der Basisklasse org.omg.CORBA.Object (Java
Bindings):
➥ _is_a(): implementiert Objekt gegebenes Interface?
➥ _non_existent(): zugehöriges Server-Objekt zerstört?
➥ _is_equivalent(): verweisen zwei Referenzen auf dasselbe
Objekt? (soweit ORB das einfach bestimmen kann)
➥ _hash(): Hashwert der Objektreferenz
➥ _duplicate() / _release(): Kopie bzw. Freigabe einer
Objektreferenz (i.a. keine Garbage Collection im ORB)
➥ _get_interface_def(): liefert Schnittstellenbeschreibung aus
Interface Repository
➥ _create_request(): erzeugt Request für DII
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
140
3.4.1 OMG IDL und Java-Mapping ...
Parameterübergabe-Semantik
➥ Alle Parametertypen außer Interfaces: call-by-value
➥ Methoden dürfen in-Parameter jedoch nicht verändern
➥ Verhalten ist sonst undefiniert
➥ IDL unterstützt spezielle Typdeklarationen (valuetype), um
Objekte zu definieren, die per Wert übergeben werden
➥ analog zu interface, aber mit Angabe echter Attribute
(State Variables)
➥ Interfaces: call-by-reference
➥ übergeben wird die Objektreferenz (kein narrow() nötig)
➥ IDL unterstützt auch abstrakte Interfaces
➥ können von valuetype und interface geerbt werden
➥ damit: Übergabesemantik erst zur Laufzeit festgelegt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
141
3.4 CORBA im Detail ...
3.4.2 Name Service
➥ Der CORBA Namensdienst definiert einen hierarchischen
Namensraum
Resorts
Mexico
Hyatt
Ixtapa
Greece
Hawaii
Club Med
Cancun
Playa Blanca
Naming Context
Object Name
➥ Aufbau eines Namens:
Resorts
Mexico
Club Med
Cancun
Context Name Context Name Context Name Simple Name
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
142
3.4.2 Name Service ...
➥ Darstellung von Namen (in IDL):
struct NameComponent {
string id;
// Eigentlicher Name
string kind; // Typ (analog zu Dateiendungen)
};
typedef sequence<NameComponent> Name;
➥ Wichtige Methoden des Namensdienstes (NamingContext)
➥ bind() / rebind() : Binden von Objektnamen
➥ bind_context() / rebind_context() : Binden eines Naming
Context unter einem (Kontext-)Namen
➥ new_context() : Erzeugen eines Naming Context
➥ unbind() : Namen entfernen
➥ list() : Ausgabe aller Namen
➥ resolve() : Namen in Objekt auflösen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
143
3.4.2 Name Service ...
➥ Erweiterte Schnittstelle NamingContextExt
➥ von NamingContext abgeleitet
➥ erlaubt u.a. Verwendung von Pfadnamen in Stringform
id
➥ z.B.: a /.c /d.e
kind
NameComponent
➥ wichtige Methoden:
➥
➥
to_name() : wandelt Namen in Stringform in eine Sequenz
von NameComponents um
resolve_str() : entspricht resolve(to_name("name"))
➥ (Java-)Referenz auf Wurzel-Naming Context:
NamingContextExt nc = NamingContextExtHelper.narrow(
orb.resolve_initial_references("NameService"))
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
144
3.4.2 Name Service ...
Beispiel
➥ Registrierung eines Objekts in einem neuen Kontext:
NamingContextExt nc = NamingContextExtHelper.narrow(
orb.resolve_initial_references("NameService");
// Erzeugen und Binden des Naming Contexts
nc.rebind_context(nc.to_name("Hello"),
nc.new_context());
// Binden der Objektreferenz an hierarchischen Namen
nc.rebind(nc.to_name("Hello/HelloWorld"), objRef);
➥ Auflösen des Namens (ohne NamingContextExt):
NameComponent path[] = { new NameComponent("Hello",""),
new NameComponent("HelloWorld", "") };
Hello obj = HelloHelper.narrow(nc.resolve(path));
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
145
3.4 CORBA im Detail ...
3.4.3 Factories
➥ Eine Factory kann auch eine Referenz auf ein neues
CORBA-Objekt zurückliefern, das durch einen eigenen Servant
implementiert wird
➥ Die Factory-Methode muß dazu:
➥ einen neuen Servant erzeugen
➥ diesen mit servant to reference() beim POA registrieren
➥ die CORBA-Referenz mit narrow() in eine Java-Referenz
umwandeln und als Ergebnis zurückliefern
➥ Eine Referenz auf den POA kann man u.a. über die von der
Klasse org.omg.PortableServer.Servant geerbten Methoden
default POA() oder poa() erhalten
➥ Beispiel: siehe WWW
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
146
3.4.3 Factories ...
Beispiel: IDL-Datei
module HelloWorld
{
// Schnittstelle der Objekte, werden vom Client über Factory erzeugt
interface Hello
{
string sayHello();
};
// Schnittstelle des Factory−Objekts
interface HelloFactory
{
Hello createHello(in string name);
};
};
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
147
3.4.3 Factories ...
Beispiel: Client (Ausschnitt)
// Resolve the object reference in naming
NameComponent path[] = ncRef.to_name("HelloWorld");
HelloFactory fact = HelloFactoryHelper.narrow(
ncRef.resolve(path));
// Erzeuge Objekte über Factory
Hello helloRef = fact.createHello("Klaus");
Hello helloRef2 = fact.createHello("Uwe");
// Rufe Methode für jedes Objekt auf
System.out.println(helloRef.sayHello());
System.out.println(helloRef2.sayHello());
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
148
3.4.3 Factories ...
Beispiel: Factory-Implementierung im Server
class HelloFactoryServant extends HelloFactoryPOA {
public HelloFactoryServant() {
}
public Hello createHello(String name) {
try {
HelloServant helloRef = new HelloServant(name);
org.omg.CORBA.Object ref =
_poa().servant_to_reference(helloRef);
return HelloHelper.narrow(ref);
} catch(...) { ... }
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (5/15)
149
Client/Server-Programmierung
WS 2014/2015
31.10.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
vi
3.4 CORBA im Detail ...
3.4.4 Delegation und Tie-Klassen
➥ In der Regel: Objekt-Implementierung erweitert die vom
IDL-Compiler erzeugte POA-Klasse, z.B.:
public class HelloImpl extends HelloPOA {
public String sayHello(String Name) {
...
➥ Falls dies nicht möglich ist: IDL-Compiler kann Tie-Klasse
erzeugen, die Aufrufe delegiert
➥ Objekt-Implementierung muß nur noch die Schnittstelle
implementieren, z.B.:
public class HelloImpl implements HelloOperations {
public String sayHello(String Name) {
...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
150
3.4.4 Delegation und Tie-Klassen ...
Aufbau der Tie-Klasse
public class HelloPOATie extends HelloPOA
{
private HelloOperations _delegate;
public HelloPOATie(HelloOperations delegate) {
_delegate = delegate;
}
// this() registriert den Servant auch beim RootPOA
public HelloWorld.Hello _this() {
return HelloWorld.HelloHelper.narrow(_this_object());
}
...
public java.lang.String sayHello(java.lang.String Name) {
return _delegate.sayHello(Name);
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
151
3.4.4 Delegation und Tie-Klassen ...
Server-Programm mit Tie-Klasse
ORB orb = ORB.init(args, null);
HelloImpl helloImpl = new HelloImpl();
HelloPOATie helloTie = new HelloPOATie(helloImpl);
Hello href = helloTie._this();
POA rootpoa = POAHelper.narrow(
orb.resolve_initial_references("RootPOA"));
rootpoa.the_POAManager().activate();
NamingContextExt ncRef = NamingContextExtHelper.narrow(
orb.resolve_initial_references("NameService"));
ncRef.rebind(ncRef.to_name("HelloWorld"), href);
orb.run();
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
152
3.4.4 Delegation und Tie-Klassen ...
Beispiel: Vererbung der Implementierung
➥ IDL-Schnittstelle:
module HelloWorld
{
interface Hello
{
string myName();
string sayHello(in string Name);
};
interface HelloToo : Hello
{
string sayHelloToo();
};
};
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
153
3.4.4 Delegation und Tie-Klassen ...
Beispiel: Vererbung der Implementierung ...
➥ Klassendiagramm der Implementierung:
HelloOperations
String myName()
String sayHello(String)
HelloPOA
HelloTooOperations
String sayHelloToo()
Hello
HelloToo
HelloTooPOA
HelloImpl
HelloTooImpl
_delegate
HelloPOATie
_delegate
HelloTooPOATie
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
154
3.4 CORBA im Detail ...
3.4.5 Statische und dynamische Aufrufe
➥ Statische Aufrufe:
➥ schnittstellenspezifische Stubs und Skeletons werden zur
Übersetzungszeit aus IDL generiert
➥ Dynamic Invocation Interface (DII):
➥ erlaubt dem Client Methoden aufzurufen, ohne daß
Schnittstelle zur Übersetzungszeit bekannt sein muß
➥
für generische Clients, z.B. Property-Editor, graphische
Entwicklungsumgebung
➥ Information zur Schnittstelle kann zur Laufzeit z.B. über
Interface Repository gewonnen werden
➥ Client muß Request explizit erzeugen und absenden
➥
auch asynchrone Aufrufe möglich
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
155
3.4.5 Statische und dynamische Aufrufe ...
➥ Dynamic Skeleton Interface (DSI):
➥ ermöglicht Objekt-Implementierungen, die zur Übersetzungs-
zeit die Schnittstelle nicht kennen, z.B.:
➥ Interpreter, Debugger, dynamisch getypte Sprachen wie
Lisp
➥ generische CORBA-Schnittstelle für Objekte einer
objektorientierten Datenbank
➥ generische Proxies (in Verbindung mit DII)
➥ Objektadapter reicht alle Aufrufe an dieselbe Methode
invoke() der Objektimplementierung weiter
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
156
3.4.5 Statische und dynamische Aufrufe ...
Beispiel für dynamischen Methodenaufruf über DII
NVList argList = orb.create_list(1); // Argumentliste aufbauen
Any arg = orb.create_any();
arg.insert_string("Roland");
NamedValue nv = argList.add_value("name", arg, ARG_IN.value);
Any res = orb.create_any(); // Ergebnisobjekt erzeugen
res.insert_string("");
NamedValue resv = orb.create_named_value("result", res,
ARG_OUT.value);
// Request erzeugen: result = sayHello(name)
Request req = helloRef._create_request(null, "sayHello",
argList, resv);
req.invoke(); // Request ausführen
// Alternativ: req.send deferred(); ...; req.get response();
String s = res.extract_string();
Roland Wismüller
Betriebssysteme / verteilte Systeme
// Ergebnis extrahieren
Client/Server-Programmierung (6/15)
157
3.4 CORBA im Detail ...
3.4.6 Portable Object Adapter (POA)
➥ Komponenten des POA-Modells:
➥ Servant:
➥
➥
➥
laufende Instanz einer Objektimplementierung
Lebenszeit von Servant und Objekt entkoppelt, Objekt ggf.
nacheinander durch mehrere Servants realisiert
Servant kann mehrere Objekte implementieren
➥ Objekt-ID:
➥
➥
im Bereich eines POA eindeutige ID
zur Zuordnung von Anfragen an Servants
➥ Objektreferenz:
➥
➥
enthält eindeutige ID des POA und Objekt-ID
zusätzlich ggf. Ort des Servers / POAs, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
158
3.4.6 Portable Object Adapter (POA) ...
➥ Komponenten des POA-Modells: ...
➥ POA:
➥
➥
➥
Namensraum für Objekt-IDs
bildet Objekt-IDs auf Servants ab
bestimmt über POA Policies das Verhalten der von ihm
verwalteten Servants
➥ Active Object Map:
➥
➥
➥
Abbildung von Objekt-IDs auf Servants
aktives Objekt: Objekt-ID steht in Active Object Map
aktiver Servant: ist in Active Object Map eingetragen
➥ Default Servant:
➥
➥
bearbeitet Anfragen für inaktive Objekte
muß bei Bedarf von der Anwendung registriert werden
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
159
3.4.6 Portable Object Adapter (POA) ...
➥ Komponenten des POA-Modells: ...
➥ Servant Manager :
➥
➥
kann bei Bedarf von der Anwendung registriert werden
übernimmt bei Anfragen an inaktive Objekte ggf.:
➥ Aktivierung eines neuen Servants
➥ Zuordnung der Objekt-ID zu vorhandenem Servant
➥ POA Manager :
➥
➥
kapselt Zustand von POAs
kann POA aktivieren oder veranlassen, daß Anfragen
(temporär) zwischengespeichert oder verworfen werden
➥ Adapter Activator :
➥
aktiviert (Kind-)POA, wenn Server Anfrage an nichtexistierenden POA erhält
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
160
3.4.6 Portable Object Adapter (POA) ...
POA-Architektur
Root POA
Active Object Map
Object ID
Servant
POA
Manager
Adapter
Activator
Objektreferenz
Servant−Zeiger
Roland Wismüller
Betriebssysteme / verteilte Systeme
POA A
Default Servant
Default
Servant
Object ID
Object ID
Object ID
Servant
Servant
POA B
Servant Manager
Servant
Manager
Object ID
Object ID
Servant
Adapter Activator
Servant
POA C
Object ID
Servant
Client/Server-Programmierung (6/15)
161
3.4.6 Portable Object Adapter (POA) ...
POA Policies
➥ Thread Policy : Multithreading im Server?
➥ SINGLE THREAD MODEL: POA ruft Methoden eines Servants
sequentiell auf
➥ ORB CRTL MODEL: implementierungsspezifisch, mehrere
Threads erlaubt
➥ Lifespan Policy : Lebensdauer der Objekte
➥ TRANSIENT: Objekte leben nur so lange wie POA
➥ PERSISTENT: Objekte können länger leben wie POA
➥
➥
POA mit gegebenem Namen; bei Server-Neustart:
➥ Server muß wieder ursprünglichen Port benutzen
➥ Server muß POA gleichen Namens erzeugen
(nicht: Objektzustand wird persistent gespeichert)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
162
3.4.6 Portable Object Adapter (POA) ...
POA Policies ...
➥ Object ID Uniqueness Policy
➥ UNIQUE ID: nur eine Objekt-ID pro Servant
➥ MULTIPLE ID: mehrere Objekt-IDs pro Servant erlaubt
➥ ID Assignment Policy : wer erzeugt Objekt-IDs?
➥ USER ID: Anwendung, SYSTEM ID: POA
➥ Request Processing Policy
➥ USE ACTIVE OBJECT MAP ONLY: Objekt-IDs werden nur über
Active Object Map (AOM) auf Servants umgesetzt
➥ USE DEFAULT SERVANT: Wenn Objekt-ID nicht in AOM ist:
Anfrage an registrierten Default Servant leiten
➥ USE SERVANT MANAGER: Wenn Objekt-ID nicht in AOM ist: über
registrierten Servant Manager neuen Servant erzeugen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
163
3.4.6 Portable Object Adapter (POA) ...
POA Policies ...
➥ Servant Retention Policy
➥ [NON ]RETAIN: Servants werden [nicht] in AOM aufgenommen
➥ Implicit Activation Policy
➥ IMPLICIT ACTIVATION: implizite Aktivierung von Servants
durch POA, z.B. bei
➥ POA.servant to reference(), POA.servant to id()
➥ ggf. Typkonvertierung von Servant nach Objektreferenz
➥ NO IMPLICIT ACTIVATION: Servant muß explizit aktiviert
werden
➥ POA.activate object(): POA generiert Objekt-ID
➥ POA.activate object with id(): Anwendung generiert
Objekt-ID
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
164
3.4.6 Portable Object Adapter (POA) ...
Standard-Policy des Root-POA
➥ Thread Policy : ORB CRTL MODEL
➥ Lifespan Policy : TRANSIENT
➥ Object ID Uniqueness Policy : UNIQUE ID
➥ ID Assignment Policy : SYSTEM ID
➥ Request Processing Policy : USE ACTIVE OBJECT MAP ONLY
➥ Servant Retention Policy : RETAIN
➥ Implicit Activation Policy : IMPLICIT ACTIVATION
➥ Policy kann nicht geändert werden, ggf. muß neuer POA erzeugt
werden
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
165
3.4.6 Portable Object Adapter (POA) ...
Beispiel: Leichtgewichtige Objekte ...
➥ Objekte mit kleinem“ Zustand
”
➥ Attribute können in Objekt-ID eincodiert werden
➥ Alle Objekte werden durch einen einzigen (Default-)Servant
realisiert
➥ Vorteil: Skalierbarkeit
➥ geringer Ressourcenverbrauch beim Server
➥ Anmerkung: mit DSI kann ein einziger Servant sogar Objekte
unterschiedlicher Klassen implementieren ...
➥ Vollständiger Code: siehe WWW
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
166
3.4 CORBA im Detail ...
3.4.7 GIOP, IIOP und IOR
➥ Seit CORBA 2.0: Kommunikationsprotokoll zwischen Objekten
bzw. ORBs ist standardisiert
➥ GIOP: General Inter-ORB Protocol
➥
Spezifikation, wie Protokolle auszusehen haben
➥ IIOP: Internet Inter-ORB Protocol
➥
konkretes Protokoll auf Basis von TCP/IP
➥ Damit: Interoperabilität zwischen verschiedenen ORB-Implementierungen
➥ IOR: Interoperable Object Reference
➥ Aufbau von Objektreferenzen ist ebenfalls standardisiert
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
167
3.4.7 GIOP, IIOP und IOR ...
GIOP
➥ Spezifiziert unter anderem:
➥ Annahmen über Transportschicht
➥
verbindungsorientiert, duplex, zuverlässig, stromorientiert
➥ binäres Übertragungsformat für IDL-Datentypen
➥
➥
➥
CDR: Common Data Representation
unterstützt Little-Endian und Big-Endian
➥ über Tag, Empfänger konvertiert bei Bedarf
keine Typ-Tags, d.h. Empfänger muß Datentyp kennen
(Problem ggf. bei dynamischen Aufrufen)
➥ acht Nachrichtenformate
➥
Request, Reply, CloseConnection, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
168
3.4.7 GIOP, IIOP und IOR ...
IIOP und IOR
➥ Implementierung des GIOP auf Basis von TCP/IP
➥ Hauptaufgabe: Festlegung des konkreten Aufbaus von IORs
➥ Genereller Aufbau einer IOR:
Repository ID
(standardisiert)
Verbindungsendpunkt Object−Key
(standardisiert)
(proprietär)
Verb.
Obj.Key
...
➥ Object-Key enthält Objekt-ID und POA-Namen
➥ mehrere Einträge für Verbindungsendpunkt / Object-Key
möglich, damit z.B.
➥
➥
Objekt über verschiedene GIOP-Protokolle erreichbar
Objekt mehrfach vorhanden (Lastausgleich, Fehlertoleranz)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
169
3.4.7 GIOP, IIOP und IOR ...
IIOP und IOR ...
➥ Verbindungsendpunkt bei IIOP: Host / IP-Adresse und Port
➥ Beispiel für Inhalt einer IOR
TypeId : IDL:omg.org/CosNaming/NamingContextExt:1.0
TAG_INTERNET_IOP Profiles:
Profile Id:
0
IIOP Version : 1.2
Host:
141.99.179.102
Port:
33523
Object key (URL):
StandardNS/NameServer−POA/_root
Object key (hex):
0x53 74 61 6E 64 61 72 64 4E 53
2F 4E 61 6D 65 53 65 72 76 65
72 2D 50 4F 41 2F 5F 72 6F 6F 74
➥ Formatiert mit dem dior-Tool des JacORB
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
170
3.4.7 GIOP, IIOP und IOR ...
Nutzung von IORs
➥ IORs in String-Form können beliebig zwischen Objekten
ausgetauscht werden, z.B.
➥ als Methoden-Parameter oder -Ergebnis
➥ über Dateien, WWW, ...
➥ Damit: Objekte können auch ohne Name Service bekanntgegeben werden
➥ Relevante Methoden (in Klasse ORB):
➥ object_to_string() : Erzeugt String-Form einer CORBA-
Objektreferenz
➥ string_to_object() : Wandelt String wieder in CORBA-
Objektreferenz um
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
171
3.4 CORBA im Detail ...
3.4.8 Implementation Repository (IMR)
➥ ORBs unterstützen typischerweise zwei Methoden, wie IORs an
Servants gebunden werden:
➥ direktes Binden: IOR enthält Host/Port des Servers, in dem
Servant läuft
➥ indirektes Binden: IOR enthält Host/Port eines externen
Brokers, d.h. des IMR
➥ IMR kennt Ort (Host/Port) des Servers
➥ IMR unterstützt u.a.:
➥ automatischer Server-Startup
➥ Migration von Servern bzw. Objekten
➥ automatischer Lastausgleich
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
172
3.4.8 Implementation Repository (IMR) ...
➥ CORBA Spezifikation standardisiert nur Interaktion zwischen
Clients und IMR
➥ ausreichend um Interoperabilität zu sichern
➥ Realisierung und Funktionsumfang des IMR sowie Schnittstelle
zu Servern ist ORB-spezifisch
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
173
3.4.8 Implementation Repository (IMR) ...
Beispiel: Automatischer Server-Start
Client
5 sayHello()
Server (bilbo: 1799)
Objektreferenz
[myPOA:hello1]
myPOA
IDL:HelloWorld/Hello:1.0 frodo:2133 myPOA:hello1
Reply von
7 sayHello()
hello1
4
LOCATION_FORWARD
[bilbo:1799]
2
rsh bilbo java HelloServer
6
3
ready
[myPOA,
bilbo: 1799]
Implementation Repository (frodo:2133)
Server−Tabelle
1
sayHello()
[myPOA:hello1]
HelloWorld myPOA rsh bilbo java HelloServer bilbo:1799
Test
Print
gandalf: 1234
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
174
3.4.8 Implementation Repository (IMR) ...
Beispiel: Automatischer Server-Start ...
1. Client ruft Methode über IOR auf, Anfrage wird an IMR geleitet
2. IMR sieht in Server-Tabelle nach, ob POA existiert.
Falls nicht, wird Server (mit POA) gestartet
3. Server sendet Fertig-Meldung an IMR, mit Host/Port.
IMR trägt Information in Server-Tabelle ein
4. IMR konstruiert neue IOR, die Host/Port des Servers enthält
und sendet LOCATION FORWARD-Nachricht an Client
5. Client sendet Anfrage zum zweiten Mal, diesmal an Server
6. Server findet POA über POA-Namen. POA findet passenden
Servant über Objekt-ID und ruft Methode auf
7. Ergebnis wird an Client zurückgegeben
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
175
3.4 CORBA im Detail ...
3.4.9 Interface Repository (IR)
➥ Online Datenbank“ mit Schnittstellenbeschreibungen
”
➥ CORBA spezifiziert nur Zugriffsmethoden (lesen / schreiben)
➥ Implementierung ist ORB-spezifisch
➥ ebenso, wie IDL-Spezifikationen in das IR kommen
➥ IR nützlich u.a. für:
➥ Typprüfung der Parameter durch den ORB (auch bei DII)
➥ Verbindung mehrerer ORBs
➥ Metadaten für Clients und Server (für DII, DSI)
➥
z.B. Klassenbrowser, Anwendungsgeneratoren, ...
➥ selbstbeschreibende Objekte (Introspection)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
176
3.4.9 Interface Repository (IR) ...
Wichtige Klassen und Methoden
➥ IR definiert Klassen (genauer: Schnittstellen) für alle
IDL-Konstrukte, z.B.:
➥ ModuleDef, InterfaceDef, OperationDef, ParameterDef, ...
➥ Objekte der Klassen enthalten einander, entsprechend der
Verschachtelung in der IDL
➥ Basisklassen Container und Contained
➥ InterfaceDef enthält mehrere OperationDefs, ...
➥ Von Contained erbt jede Klasse die Methode describe()
➥ liefert Beschreibung des IDL-Konstrukts als Struct
➥
z.B. struct OperationDescription enthält Name, Repository-ID, Ergebnistyp, Parameterliste, Exceptions, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
177
3.4.9 Interface Repository (IR) ...
Startpunkte für die IR-Information
➥ Methode _get_interface_def() liefert InterfaceDef eines
Objekts:
Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
org.omg.CORBA.Object c = helloRef._get_interface_def();
org.omg.CORBA.InterfaceDef id =
org.omg.CORBA.InterfaceDefHelper.narrow(c);
➥ Methode lookup_id() des IR liefert IR-Objekt zu einer
Repository-ID
➥ Repository-ID beschreibt IDL-Element eindeutig, z.B. im
Hello-World-Beispiel:
➥ IDL:HelloWorld/Hello:1.0 für Interface Hello
➥ IDL:HelloWorld/Hello/sayHello:1.0 für Operation
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (6/15)
178
Client/Server-Programmierung
WS 2014/2015
07.11.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
vii
3.4 CORBA im Detail ...
3.4.10 Sicherheit
➥ CORBA-Spezifikation enthält Security Attribute Service
➥ Basis ist GIOP über (z.B.) SSL/TLS
➥ sichert Vertraulichkeit/Integrität der Nachrichten
➥ sichert Authentifizierung des Servers
➥ Security Attribute Service realisiert zusätzlich:
➥ Authentifizierung des Clients
➥
u.a. über Benutzername und Paßwort
➥ Weitergabe von Sicherheitsattributen (z.B. Identität,
Privilegien) des Clients an den Server
➥
damit: Delegation von Rechten möglich, d.h. Server kann
für Benutzer agieren
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
179
3 CORBA ...
3.5 Zusammenfassung
➥ CORBA definiert ein verteiltes, sprach- und plattform-unabhängiges Objektmodell
➥ standardisiertes Protokoll (GIOP, IIOP) stellt Interoperabilität
sicher
➥ Zentral: Schnittstellenbeschreibung über OMG IDL
➥ automatische Erzeugung von Stubs und Skeletons
➥ Keine 1-zu-1 Beziehung zwischen Objekten und Objektimplementierungen (Servants)
➥ POA kann unterschiedliche Policies realisieren
➥ CORBA spezifiziert Schnittstellen zu etlichen Diensten
➥ Namensdienst, Ereignisdienst, Lebenszyklus, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
180
Client/Server-Programmierung
WS 2014/2015
4
RMI / IIOP
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
181
4 RMI / IIOP ...
Inhalt
➥ RMI über IIOP
➥ Farley, Crawford, Flanagan: S. 88ff, Kap. 7
➥ http://java.sun.com/j2se/1.5.0/docs/guide/rmi-iiop
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
182
4 RMI / IIOP ...
RMI über IIOP
➥ Ziel:
➥ Verbindung von Java-RMI Objekten mit nicht-Java (CORBA)
Objekten
➥ Vorgehensweise:
➥ RMI nutzt CORBA IIOP-Protokoll zur Kommunikation
zwischen Objekten
➥ Damit:
➥ Java-Client kann CORBA Objekt über RMI nutzen
➥ CORBA-Client kann RMI-Objekt über CORBA nutzen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
183
4 RMI / IIOP ...
Vorgehen zur Nutzung von RMI/IIOP
➥ Basisklasse: Remote-Objekte müssen von
javax.rmi.PortableRemoteObject erben statt von
java.rmi.server.UnicastRemoteObject
➥ RMI Compiler: Stubs und Skeletons müssen über rmic -iiop
erzeugt werden
➥ Option -idl erzeugt zusätzlich OMG IDL Datei
➥ Namensdienst: statt RMI Registry muß JNDI benutzt werden,
um auf CORBA-Namensdienst zuzugreifen
➥ Downcast: vom Namensdienst erhaltene Objektreferenzen
müssen über PortableRemoteObject.narrow() in gültige
Referenzen umgewandelt werden
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
184
4 RMI / IIOP ...
Beispiel: Gemischtes“ Hello World
”
➥ Server mit RMI realisiert
➥ Schnittstelle:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote
{
String sayHello(String to) throws RemoteException;
}
➥ Client wahlweise mit RMI oder CORBA
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
185
4 RMI / IIOP ...
Server-Code
import
import
import
import
javax.naming.*;
java.rmi.*;
java.util.*;
javax.rmi.PortableRemoteObject;
public class HelloServer extends PortableRemoteObject
implements Hello {
public HelloServer() throws RemoteException {
super();
}
public String sayHello(String to) {
System.out.println("Hello-Server called");
return "Hello World to " + to + "!";
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
186
4 RMI / IIOP ...
Server-Code ...
public static void main(String args[]) {
try {
// Server−Objekt erzeugen
HelloServer obj = new HelloServer();
// Referenz über JNDI beim Namensdienst registrieren
Properties props = new Properties();
props.put("java.naming.factory.initial",
"com.sun.jndi.cosnaming.CNCtxFactory");
props.put("java.naming.provider.url",
"iiop://bspc02:5555");
Context ctx = new InitialContext(props);
ctx.rebind("HelloWorld", obj);
}
catch (Exception e) { ... }
} }
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
187
4 RMI / IIOP ...
RMI Client
public static void main(String args[]) {
try {
// Obektreferenz über JNDI vom Namensdienst besorgen
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.cosnaming.CNCtxFactory");
props.put(Context.PROVIDER_URL, "iiop://bspc02:5555");
Context ctx = new InitialContext(props);
Hello obj = (Hello)
PortableRemoteObject.narrow(ctx.lookup("HelloWorld"),
Hello.class);
// Remote Methode aufrufen
System.out.println(obj.sayHello("Roland"));
}
catch (Exception e) { ...}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
188
4 RMI / IIOP ...
CORBA Client
public static void main(String args[]) {
try{
// ORB erzeugen und initialisieren
ORB orb = ORB.init(args, null);
// Root naming context holen
org.omg.CORBA.Object ns =
orb.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(ns);
// Objektreferenz vom Namensdienst besorgen
NameComponent path[] = ncRef.to_name("HelloWorld");
Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
System.out.println(helloRef.sayHello("Peter"));
}
catch(Exception e) { ... }
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
189
4 RMI / IIOP ...
Code-Erzeugung mit RMI-Server / CORBA-Client
Client−Seite Server−Seite
_HelloStub.java
Hello.java
HelloHolder.java
HelloHelper.java
javac
idlj
Hello.class
Hello.java
HelloOperations.java
HelloClient.java
HelloClient.class
Roland Wismüller
Betriebssysteme / verteilte Systeme
HelloServer.java
HelloServer.class
rmic −iiop −idl
javac
...
Hello.idl
_Hello_Stub.class
_HelloServer_Tie.class
Client/Server-Programmierung (7/15)
190
Client/Server-Programmierung
WS 2014/2015
5
Java Komponenten-Modelle
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
191
5 Java Komponenten-Modelle ...
Inhalt
➥ Komponenten-Modelle
➥ Java Beans
➥ Enterprise Java Beans (EJB 3.0)
➥ Burke / Monson-Haefel
➥ Farley / Crawford / Flanagan, Kap. 6 (EJB 2.1!)
➥ Orfali / Harkey, Kap. 27-34 (EJB 2.1!)
➥ Sriganseh / Brose / Silverman
➥ http://docs.oracle.com/javase/7/docs/api/java/beans/
package-summary.html
➥ http://docs.oracle.com/javaee/6/tutorial/doc
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
192
5 Java Komponenten-Modelle ...
5.1 Komponenten-Modelle
➥ Was sind Software-Komponenten?
Software-Komponenten sind ausführbare Software-Einheiten,
die unabhängig hergestellt, erworben und konfiguriert werden und
aus denen sich funktionierende Gesamtsysteme
zusammensetzen lassen.
➥ Im Vordergrund: Zusammensetzungsaspekt
➥ Eine Komponente ist:
➥ eine funktional und technisch abgeschlossene, ausführbare
Einheit
➥ unabhängig als Einheit entwickelbar und konfigurierbar
➥ wiederverwendbar
➥ nur über genau festgelegte Schnittstellen ansprechbar
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
193
5.1 Komponenten-Modelle ...
Begriffe
➥ Visuelle Komponente
➥ stellt etwas auf dem Bildschirm (der Anwendung) dar
➥ Nichtvisuelle Komponente
➥ ist für Benutzer der Anwendung nicht sichtbar
➥ Komponentenmodell: definiert
➥ Architektur der Komponenten u. Struktur ihrer Schnittstellen
➥ Mechanismen zur Zusammenarbeit mit Container und
anderen Komponenten
➥ Container: Ausführungsumgebung für Komponenten
➥ Kontext, in dem Komponenten gruppiert und miteinander
verbunden werden
➥ stellt Management- und Kontroll-Dienste zur Verfügung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
194
5.1 Komponenten-Modelle ...
Software-Entwicklung mit Komponenten
➥ Zwei Arten von Programmierern:
➥ Komponenten-Entwickler (component developer )
➥
implementiert eine Komponente
➥ Komponenten-Anwendungsentwickler (component assembler )
➥
➥
entwickelt eine Anwendung (oder neue Komponenten)
durch Zusammenfügen existierender Komponenten
i.d.R. mit (graphischer) Werkzeug-Unterstützung!
➥ Bei Komponenten daher zwei verschiedene Nutzungsphasen:
➥ Design Time: während der Anwendungsentwicklung
➥ Run Time: während der Ausführung der Anwendung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
195
5.1 Komponenten-Modelle ...
Software-Entwicklung mit Komponenten: Beispiel
➥ Zusammenbau einer Komponente aus Teilkomponenten:
public class MyEventAdapter {
{
private TextBean target;
MyEventAdapter(TaextBean t) {
target = t;
}
public void actionPerformed(
ActionEvent e) {
if (x < max)
val = x;
target.setValue(val);
}
}
➥ Verwendung der Komponente in einer Anwendung:
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
196
5.1 Komponenten-Modelle ...
Werkzeug-Unterstützung (Bsp: Visual Café)
Komponenten−
auswahl
Anwendung mit
Komponenten
Editor für
Komponenten−
Eigenschaften
Wizard zur
Komponenten−
Verknüpfung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
197
5.1 Komponenten-Modelle ...
Vorteile eines Komponenten-Modells
➥ Wiederverwendung von Software
➥ Vereinfachte Designphase für Anwendungen
➥ Vereinfachte Implementierungsphase für Anwendungen
➥ Zusammenstecken“ von Komponenten
”
➥ Bessere Skalierbarkeit
➥ Unterstützung durch Entwicklungswerkzeuge
➥ Ziel: Aufbau eines Markts von Komponenten
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
198
5 Java Komponenten-Modelle ...
5.2 Komponentenmodelle in Java EE
➥ Java EE: Java Enterprise Edition
➥ Java EE definiert Familie von Komponentenmodellen:
➥ für Client-Tier : JavaBeans, Applets
➥ für Webserver-Tier : Servlets, JSP
➥ für Anwendungsserver-Tier : Enterprise JavaBeans (EJB)
➥ Daneben bietet Java EE weitere Dienste, z.B.
➥ Namensdienst (JNDI)
➥ Nachrichten-Infrastruktur (Java Messaging Service, JMS)
➥ Datenbank-Zugriff (JDBC)
➥ Transaktionsdienste, Sicherheitsdienste, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
199
5.2 Komponentenmodelle in Java EE ...
Verteilte Anwendungen mit Java EE
Applet−Container
Applet
HTTP
/SSL
Web−Container
Java SE
EJB−Container
RMI/
IIOP
JSP
EJB
Servlet
Application−
Client−Container
Client
Standard Services
Java SE
HTTP
/SSL Standard Services
Java SE
Standard Services
Java SE
JDBC
RMI/IIOP
JDBC
Roland Wismüller
Betriebssysteme / verteilte Systeme
JDBC
Database
Client/Server-Programmierung (7/15)
200
5 Java Komponenten-Modelle ...
5.3 JavaBeans
➥ JavaBeans ist Spezifikation eines Komponentenmodells für Java
➥ definiert mehrere neue Java-Klassen und Schnittstellen
➥ besteht aber i.W. nur aus Namenskonventionen bzw.
Entwurfsmustern
➥ Ziel: Zusammenfügen von Komponenten mit Hilfe von visueller
Programmierung
➥ graphische Werkzeuge zur Anwendungserstellung
➥ Im Prinzip ist jede Java-Klasse eine JavaBean!
➥ Kompositions- und Anpassungsfähigkeit aber nur garantiert,
wenn Konventionen eingehalten werden
➥ I.d.R. besteht eine Bean aber aus mehreren Klassen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
201
5.3 JavaBeans ...
Was bietet eine JavaBean?
➥ Methoden
➥ wie jede andere Java-Klasse auch ...
➥ Eigenschaften (Properties)
➥ Attribute, über die mit Get- und Set-Methoden zugegriffen
werden kann
➥ Ereignisse (Events)
➥ werden von der Bean erzeugt
➥ können über Event Listener an andere Beans weitergegeben
werden
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
202
5.3 JavaBeans ...
Was bietet eine JavaBean? ...
➥ Introspektion
➥ Bean stellt über eine BeanInfo-Klasse Information über ihre
Methoden, Eigenschaften und Ereignisse bereit
➥
automatisch oder manuell erzeugt
➥ Anpassung (Customization)
➥ erlaubt Konfiguration der Properties über graphische
Werkzeuge
➥ Persistenz
➥ Properties der Bean können dauerhaft gespeichert und bei
Erzeugung der Bean geladen werden
➥
serialisiertes Objekt in .ser-Datei
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
203
5.3 JavaBeans ...
Black-Box Sicht einer JavaBean
BeanInfo
Customizer
Methoden
Properties
JavaBean
Komponente
Ereignisse
JAR−Archiv
(incl. .ser−Dateien)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
204
5.3 JavaBeans ...
Design-Time und Run-Time-Beans
➥ Run-Time-Bean:
➥ Sammlung von Klassen mit Programmlogik
➥ plus ggf. serialisierte Objektzustände (.ser-Dateien)
➥ Design-Time-Bean:
➥ zusätzliche Klassen für
➥
➥
Customizer bzw. Property -Editoren
Introspektion (BeanInfo)
➥ Icons für die Bean
➥ diese Klassen und Icons werden nur von graphischen
Entwicklungsumgebungen benötigt
➥ Klassen (und .ser-Dateien) sind typischerweise in einem
Java-Archiv abgelegt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
205
5.3 JavaBeans ...
JDK als Komponenten-Framework
➥ Für JavaBeans übernimmt JDK die Rolle des KomponentenFrameworks
➥ Dienste für JavaBeans:
➥ Graphisches Layout und Darstellung
➥
➥
für visuelle Komponenten: AWT bzw. Swing
visuelle Bean erbt von AWT Component;
AWT Container dient als Komponenten-Container
➥ Ereignismodell, Properties, Introspektion, Persistenz,
Customization
➥ Bereitstellung der benötigten Klassen / Interfaces
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
206
5.3 JavaBeans ...
Beispiel: Smiley-Bean
public class SmileyBean extends Canvas {
private boolean smile = true;
...
public SmileyBean() {
setSize(250,250);
}
public synchronized void toggleSmile() {
smile = !smile;
repaint();
}
public void paint(Graphics g) { ... }
}
➥ Vollständiger Code: Orfali / Harkey, Kap. 28 bzw. CD-ROM
➥ SmileyBean ist lediglich eine normale Java-Klasse
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
207
5.3 JavaBeans ...
Beispiel: Container für Smiley-Bean
public class SmileyPlace extends Frame ... {
SmileyPlace() {
SmileyBean smiley = null;
// instantiiere die Bean
try {
smiley = (SmileyBean)Beans.instantiate(null,
"SmileyBean");
}
catch (Exception e) { ... }
// füge Bean in Container ein
add(smiley);
...
}
static public void main(String args[]) { ... }
...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
208
5.3 JavaBeans ...
Konventionen für Beans
➥ Beans dürfen nicht mit new erzeugt werden
➥ stattdessen: Beans.instantiate(classloader, name)
➥ Beans müssen einen Default-Konstruktor (ohne Argumente)
besitzen
➥ Visuelle Beans sollten von java.awt.Component (oder einer
Unterklasse) abgeleitet werden
➥ Als Komponenten-Container sollte ein AWT Container dienen
➥ Hinzufügen der Beans über die Methode add()
➥ Cast-Operationen oder instanceof sollten nicht verwendet
werden
➥ stattdessen: Beans.getInstanceOf(obj, class) bzw.
Beans.isInstanceOf(obj, class)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
209
5.3 JavaBeans ...
5.3.1 Ereignisse
➥ JavaBeans können Ereignisse erzeugen bzw. Ereignisse
behandeln
➥ Ereignismodell: Publish-Subscribe-Modell
➥ identisch mit dem Ereignismodell des AWT
➥ Beans geben (über Introspection) bekannt, welche Ereignisse
sie auslösen können
➥ interessierte Beans registrieren sich bei der Ereignisquelle
➥ Ereignisse sind Objekte, die von EventObject abgeleitet sind
➥ beinhalten Ereignisquelle sowie beliebige andere Parameter
des Ereignisses
➥ Namenskonvention: Klassenname muß mit Event enden
➥
z.B. ButtonEvent
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
210
5.3.1 Ereignisse ...
Ereigniskonsumenten (Event Listener)
➥ Erhalten Ereignisbenachrichtigungen
➥ Müssen Schnittstelle implementieren, die von
java.util.EventListener abgeleitet ist
➥ Namenskonvention: Ereignisname mit Endung Listener
➥ pro Ereignistyp eine Methode, ohne Namenskonvention
➥
Methode erhält Ereignisobjekt als Parameter
➥ Beispiel (für Ereignis ButtonEvent):
public interface ButtonListener extends EventListener {
public void onPress(ButtonEvent e);
public void onRelease(ButtonEvent e);
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
211
5.3.1 Ereignisse ...
Ereignisquellen (Event Sources)
➥ Sind Beans, die Ereignisse erzeugen
➥ Ereignisse werden für Listener über zwei Methoden verfügbar
gemacht (Namenskonvention!):
➥ addListenerType (): Anmelden eines Listeners
➥ removeListenerType (): Abmelden eines Listeners
➥ z.B. für ButtonEvent:
void addButtonListener(ButtonListener l)
void removeButtonListener(ButtonListener l)
➥ Ereignisquelle ist für Verwaltung der Listener und Aufruf der
Methode zur Ereignismeldung (z.B. onPress()) verantwortlich
➥ typisch mittels Vector und Schleife über alle Listener
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (7/15)
212
Client/Server-Programmierung
WS 2014/2015
14.11.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
viii
5.3.1 Ereignisse ...
Beispiel: Smiley und Button
➥ Button ist AWT-Element und auch JavaBean
➥ stellt Ereignis ActionEvent zur Verfügung:
public interface ActionListener extends EventListener {
public void actionPerformed(ActionEvent e);
}
➥ Button-Ereignis soll zum Umschalten des Smiley führen
➥ Einfachste Realisierung: direkte Verdrahtung“
”
➥ SmileyBean implementiert ActionListener-Interface
public class SmileyBean extends Canvas
implements ActionListener {
...
public void actionPerformed(ActionEvent e) {
toggleSmile();
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
213
5.3.1 Ereignisse ...
Beispiel: Container
public class SmileyPlace extends Frame ... {
SmileyPlace() {
SmileyBean smiley = null;
Button button = null;
try { // instantiiere die Beans
smiley = (SmileyBean)Beans.instantiate(null, "SmileyBean");
button = (Button)Beans.instantiate(null, "java.awt.Button");
}
catch (Exception e) { ... }
add(smiley, "North"); // füge Beans in Container ein
add(button, "South");
button.addActionListener(smiley); // verbinde die Beans
...
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
214
5.3.1 Ereignisse ...
Ereignis-Adapter
➥ Nachteil der direkten Verdrahtung:
➥ Listener muß passende Schnittstelle implementieren
➥ widerspricht Idee, Beans über Werkzeuge zu verdrahten“
➥
➥
”
Bean kann Ereignisse nicht a-priori kennen
Code der Bean kann nicht geändert werden
➥ Abhilfe: Verwendung eines Adapters (Indirektion)
➥ Adapter implementiert passende Listener -Schnittstelle
und ruft Methode in der Ziel-Bean auf
➥ Vorteile (u.a.):
➥
➥
➥
Beans bleiben vollständig unabhängig voneinander
Adapter kann Schnittstellen ggf. anpassen
Adapter kann Ereignis auch an Remote-Objekt leiten
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
215
5.3.1 Ereignisse ...
Beispiel: Smiley und Button
addActionListener()
Toggle
action
Performed()
Button
Smiley
Event
Adapter
toggle
Smile()
SmileyBean
public class SmileyEventAdapter implements ActionListener {
private SmileyBean target;
SmileyEventAdapter(SmileyBean t) {
target = t;
}
public void actionPerformed(ActionEvent e) {
target.toggleSmile();
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
216
5.3 JavaBeans ...
5.3.2 Properties
➥ Eigenschaften einer Komponente
➥ können zur Design-Zeit mit Entwicklungswerkzeugen
verändert werden
➥ und werden dann persistent gespeichert
➥ können zur Laufzeit abgefragt und/oder gesetzt werden
➥ Zugriff ausschließlich über Get- und Set-Methoden
➥ d.h. Implementierung nicht unbedingt 1-zu-1 als Attribut
➥ Arten von Properties:
➥ einfache und Indexed Properties (d.h. Arrays)
➥ Bound und Constrained Properties
➥
Benachrichtigungs-Ereignisse bei Änderungen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
217
5.3.2 Properties ...
Namenskonventionen für Get- und Set-Methoden
➥ Einfache Properties (Beispiel: int Age)
➥ public int getAge();
➥ public void setAge(int value);
➥ Einfache Boole’sche Properties
➥ public int isMarried();
➥ public void setMarried(boolean value);
➥ Indexed Properties (Beispiel: short[] TabStops)
➥
➥
➥
➥
public
public
public
public
short[] getTabStops();
short getTabStops(int index);
void setTabStops(short[] value);
void setTabStops(int index, short value);
➥ Alle Methoden sind optional
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
218
5.3.2 Properties ...
Bound Properties
➥ Eine Bean kann Änderungen von Properties als Ereignisse an
interessierte Beans weitermelden
➥ Dazu: Bean muß Ereignis PropertyChangeEvent unterstützen
public interface PropertyChangeListener extends EventListener {
public void propertyChange(PropertyChangeEvent e);
}
➥ D.h. Bean muß folgende Methoden besitzen:
void addPropertyChangeListener(PropertyChangeListener l)
void removePropertyChangeListener(PropertyChangeListener l)
➥ JDK bietet Klasse PropertyChangeSupport zur Verwaltung und
Benachrichtigung der Listener
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
219
5.3.2 Properties ...
Constrained Properties
➥ Wie Bound Properties, aber Listener haben die Möglichkeit, der
Änderung zu widersprechen (Veto)
➥ Dazu: Ereignis VetoableChangeEvent
public interface VetoableChangeListener extends EventListener {
public void vetoableChange(VetoableChangeEvent e);
}
➥ Listener kann in vetoableChange() eine PropertyVetoException werfen, um der Änderung zu widersprechen
➥ Hilfsklasse VetoableChangeSupport zur Verwaltung und
Benachrichtigung der Listener
➥ bei Veto: Benachrichtigung abbrechen, alle Listener mit
ursprünglichem Wert erneut benachrichtigen, liefert
PropertyVetoException an Aufrufer
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
220
5.3 JavaBeans ...
5.3.3 Persistenz
➥ Beans können wie normale Objekte serialisiert und in Dateien
gespeichert werden
➥ Bean (bzw. Oberklasse) muß Schnittstelle Serializable
implementieren
➥ Beispiel:
FileOutputStream fos = new FileOutputStream("Smiley.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(smiley);
➥ Beans.instantiate(classloader, name) sucht .ser-Datei mit
gegebenem Namen
➥ falls erfolgreich: erzeuge Bean mit dem serialisierten Zustand
aus der Datei
➥ sonst: erzeuge frische“ Bean der angegebenen Klasse
”
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
221
5.3 JavaBeans ...
5.3.4 Introspektion
➥ Über Methode java.beans.Introspector.getBeanInfo() kann
Information über eine Bean abgefragt werden:
➥ Methoden, Properties, Ereignisse, ...
➥ Information wird in BeanInfo-Objekt zurückgeliefert
➥ Bean kann Information explizit bereitstellen
➥
über eine Klasse BeanName BeanInfo (Namenskonvention!), die BeanInfo-Schnittstelle implementiert
➥ z.B. SmileyBeanBeanInfo für SmileyBean
➥ sonst: Introspector erzeugt die Information dynamisch
➥
setzt voraus, daß sich die Bean genau an die Namenskonventionen hält
➥ Erweiterung des Java Reflection-Mechanismus
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
222
5.3.4 Introspektion ...
Information in der BeanInfo
➥ BeanDescriptor: Bean-Klasse und Customizer -Klasse
➥ Customizer ist optional; implementiert Bean-spezifische GUI
(für Entwicklungswerkzeuge), um Eigenschaften der Bean
anzupassen
➥ PropertyDescriptor: Beschreibung der Properties
➥ Name, Typ (Klasse), Get- und Set-Methode,
Bound/Constrained Property?, ...
➥ Property Editor : optional; implementiert Bean-spezifische
Editor-Komponente (für Entwicklungswerkzeuge) für eine
Property (z.B. Farbe)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
223
5.3.4 Introspektion ...
Information in der BeanInfo ...
➥ EventSetDescriptor: Beschreibung der Ereignisse
➥ Listener -Klasse, Listener -Methoden, Add und
Remove-Methoden für Listener, ...
➥ MethodDescriptor: Beschreibung der Methoden
➥ Name, Method-Objekt (Java Reflection), Beschreibung der
Parameter, ...
➥ Icon zur Darstellung der Bean in Entwicklungswerkzeugen
➥ Default-Property und Default-Ereignis
➥ die am wahrscheinlichsten vom Benutzer eines
Entwicklungswerkzeugs ausgewählt werden
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
224
5.3 JavaBeans ...
5.3.5 Zusammenfassung
➥ Komponentenmodell für Java
➥ vorwiegend für clientseitige, visuelle Komponenten
➥ Ziel: werkzeugunterstützte Erstellung von Anwendungen
➥ Java Beans unterstützt:
➥ Methoden
➥ Eigenschaften (Properties)
➥
auch mit Ereignismeldung/Veto bei Änderung
➥ Ereignisse (über Listener -Interface)
➥ Introspektion (für Werkzeuge)
➥ Anpassung (Customization) (für Werkzeuge)
➥ Persistenz (Speicherung der konfigurierten Properties)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
225
5 Java Komponenten-Modelle ...
5.4 Enterprise Java Beans (EJB 3.0)
➥ Was sind Enterprise Java Beans?
➥ serverseitige Komponenten-Architektur für Entwicklung und
Deployment von komponenten-basierten verteilten
Geschäftsanwendungen
➥ d.h.: Komponenten-Modell für Anwendungslogik einer
verteilten Anwendung
➥ EJBs werden immer in speziellem EJB-Container ausgeführt
➥ anwendungsunabhängiger Anwendungsserver
➥ Implementierungen von verschiedenen Anbietern
➥
z.B. JBoss, OpenEJB, IBM WebSphere, BEA WebLogic
➥ Schnittstelle zu EJBs ist standardisiert
➥ Zugriff auf EJBs erfolgt immer über EJB-Container
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
226
5.4 Enterprise Java Beans (EJB 3.0) ...
Ziel der EJB-Architektur
➥ Anwendungsprogrammierer erstellt nur Anwendungslogik
➥ und zwar komponentenbasiert ...
➥ Alle wichtigen, anwendungsunabhängigen Dienste werden vom
EJB-Container realisiert
➥ Nutzung der Dienste ist implizit
➥
➥
wird nicht ausprogrammiert
Spezifikation und Konfiguration der Dienste bei Erstellung
und/oder beim Deployment der EJB
➥ EJB-Container übernimmt Rolle eines Component Transaction
Monitors
➥ realisiert Komponentenmodell, Transaktions- und
Ressourcen-Management
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
227
5.4 Enterprise Java Beans (EJB 3.0) ...
Component Transaction Monitor
➥ Vereinigung von Transaktionsmonitor und ORB
➥ Aufgabe: automatisches Management von
➥ Transaktionen
➥ Persistenz von Objekten
➥ Sicherheit (insbes. Zugriffskontrolle)
➥ Ressourcenverwaltung (z.B. Pooling)
➥ Objektverteilung
➥ Nebenläufigkeit
➥ Fokus: zuverlässige, transaktionsorientierte Anwendungen mit
vielen Nutzern
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
228
5.4 Enterprise Java Beans (EJB 3.0) ...
Grundlegende Elemente in einer EJB-Umgebung
Business
Interface
Anwendungs−
Methoden
EJB Container
(Transaktionsmanagement
Zugriffskontrolle
Ressourcen−Pooling
Persistenz)
EJB
Client
EJB Instanzen
(Anwendungs−Methoden)
Antwort
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
229
5.4 Enterprise Java Beans (EJB 3.0) ...
Das EJB 3.0 Programmiermodell
EJB Container
Remote
Client
(8)
(1) Methoden−
aufruf
Remote
Sicht
Lokale
Sicht
(1)
(8)
Business
Interface
Lokaler
Client
(2) Aufruf der Methode
in der Wrapper Klasse
(7)
Wrapper−
Klasse*
(4) Aufruf der Methode
in der Bean Klasse
(5)
EJB
Klasse
Roland Wismüller
Betriebssysteme / verteilte Systeme
(3) API−Aufrufe für Dienste
vor Methodenaufruf
Container−
Dienste
(6) API−Aufrufe für Dienste
nach Methodenaufruf
* vom Container generiert
i.a. als EJB Objekt bezeichnet
Client/Server-Programmierung (8/15)
230
5.4 Enterprise Java Beans (EJB 3.0) ...
5.4.1 Arten von EJBs
➥ Entity Beans
➥ Daten-Objekte, die persistent (in Datenbank) gespeichert und
von mehreren Clients genutzt werden
➥ d.h. Objekte bzw. Beziehungen der Anwendungsmodellierung
➥
z.B. Kunde, Konto, Aktie, ...
➥ in EJB 3.0 nicht weiterentwickelt, aber weiterhin unterstützt
➥ (im folgenden nicht mehr behandelt, siehe Skript WS07/08)
➥ Entities (ab EJB 3.0, Java Persistence API)
➥ Ziele und Aufgaben wie bei Entity Beans, aber nur lokal
zugreifbar, leichtgewichtiger und besser standardisiert
➥ Persistenz wird automatisch durch Container realisiert
➥ auch unabhängig von Java EE verwendbar
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
231
5.4.1 Arten von EJBs ...
➥ Session Beans
➥ realisieren Aktionen, die mehrere Anwendungsobjekte
(Entities bzw. Entity Beans) betreffen
➥ d.h. die Geschäftslogik
➥ zustandslos (stateless) oder zustandsbehaftet (stateful)
➥ d.h. merkt sich die Bean Daten zwischen zwei Aufrufen
eines Clients?
➥ stateful Session Beans repräsentieren Client-Sitzungen
➥ kein persistenter Zustand
➥ Message Driven Beans (ab EJB 2.0)
➥ ähnlich wie Session Beans, aber asynchrone Schnittstelle
➥ Operationen werden über JMS-Nachrichten aufgerufen
statt über (entfernte) Methodenaufrufe
➥ (im folgenden nicht mehr behandelt)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
232
5.4 Enterprise Java Beans (EJB 3.0) ...
5.4.2 Anatomie einer EJB-Anwendung
➥ Eine EJB-Anwendung besteht aus:
➥ Session (bzw. Message Driven) Beans für die Anwendungslogik
➥ Session Beans sind normale Java-Klassen mit
Annotationen
➥ Local und Remote Business Interfaces der Session Beans
➥ normale Java-Interfaces, mit Annotationen
➥ i.d.R. durch zugehörige Session Bean implementiert
➥ Entities (bzw. Entity Beans) für das Datenmodell
➥ Entities sind normale Java-Klassen mit Annotationen
➥ Deployment-Deskriptoren
➥ XML-Dokumente
➥ beschreiben Beans und vom Container benötigte Dienste
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
233
5.4.2 Anatomie einer EJB-Anwendung ...
➥ Mehrere Beans werden mit gemeinsamen Deployment-Deskriptoren in ein JAR-Archiv gepackt
➥ Deployment-Deskriptoren im Verzeichnis META-INF
➥ META-INF/ejb-jar.xml kennzeichnet Archiv als EJB Archiv
➥ EJB-Anwendung besteht aus ein oder mehreren JAR-Archiven
➥ Alle weiteren benötigten Klassen werden zur Laufzeit generiert
➥ z.B.:
➥
➥
Wrapper -Klassen für EBJ-Klassen bzw. Implementierungsklassen der Business Interfaces
Stub-Klassen für die Clients
➥ Basis: generische Proxy-Klasse java.lang.reflect.Proxy
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
234
5.4.2 Anatomie einer EJB-Anwendung ...
Deployment-Deskriptoren
➥ ejb-jar.xml: für Session Beans (und andere)
➥ kann Annotationen in den EJB-Klassen überschreiben bzw.
ergänzen
➥
z.B. Kennzeichnung als EJB, Art der EJB, Verwaltung der
EJB zur Laufzeit (Transaktionen, Zugriffskontrolle), ...
➥ Arbeitsaufteilung zwischen EJB-Entwickler (Annotationen)
und Anwendungsentwickler (Deployment-Deskriptor)
➥ persistency.xml: für Entities
➥ analog zu ejb-jar.xml
➥ spezifiziert zusätzlich die Verbindung zur Datenbank
➥ Zusätzlich Container-spezifische Deskriptoren möglich
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
235
5.4 Enterprise Java Beans (EJB 3.0) ...
5.4.3 Einschub: Java Annotationen
➥ Eingeführt mit Java 5 (JDK 1.5)
➥ Erlauben die Spezifikation von beliebigen Metadaten für
Programm-Elemente
➥ z.B. für Typen, Methoden, Attribute, Parameter, Annotationen
➥ Annotationen werden vom Compiler übersetzt und sind getypt
➥ Typdefinition ähnlich wie bei Schnittstellen
➥ Die Annotationen eines Elements können zur Laufzeit über das
Reflection API abgefragt werden
➥ bei entsprechender Definition der Annotation
➥ Neben Annotationen des Java-Standards können auch eigene
Annotationen definiert werden
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
236
5.4.3 Einschub: Java Annotationen ...
Beispiel
➥ Definition einer Annotation:
import java.lang.annotation.*;
// Meta−Annotation: Annotation soll auch zur Laufzeit verfügbar sein
@Retention(RetentionPolicy.RUNTIME)
// Meta−Annotation: Annotation ist auf Klassen und Interfaces anwendbar
@Target(ElementType.TYPE)
// Definition der Annotation
public @interface CodeCategory {
boolean isTested();
String[] tester() default {};
boolean isReviewed() default false;
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
237
5.4.3 Einschub: Java Annotationen ...
Beispiel ...
➥ Verwendung der Annotation:
@CodeCategory(isTested = true, tester = {"joe","max"})
public class MyClass {
// ...
}
➥ Zugriff auf die Annotation zur Laufzeit:
MyClass obj = new MyClass();
CodeCategory cat =
obj.getClass().getAnnotation(CodeCategory.class);
System.out.println("is tested: " + cat.isTested());
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
238
5.4.3 Einschub: Java Annotationen ...
Anmerkungen zum Beispiel
➥ Bei Verwendung einer Annotation müssen die Attribut“-Werte mit
”
der Syntax <Name> = <Wert> angegeben werden
➥ die Reihenfolge ist dabei beliebig
➥ Ausnahme: die Annotation hat nur ein (oder gar kein) Attribut
➥
z.B. @Retention und @Target
➥ Attribute können auch mit Default-Werten definiert werden
➥ z.B. tester und isReviewed
➥ bei Verwendung der Annotation brauchen dann keine Werte
angegeben zu werden
➥ eine leere Parameterliste kann auch ganz weggelassen werden
➥ Attribute können auch Arrays sein
➥ z.B. tester
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
239
5.4 Enterprise Java Beans (EJB 3.0) ...
5.4.4 Beispiel Hello World
Remote Business Interface
package org.Hello;
import javax.ejb.Remote;
// Java Annotation: markiert Schnittstelle als Remote EJB Interface
@Remote
public interface HelloRemote
{
public String sayHello();
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
240
5.4.4 Beispiel Hello World ...
EJB-Klasse
package org.Hello;
import javax.ejb.Stateless;
// Java Annotation: markiert Klasse als Stateless Session Bean
@Stateless
public class HelloImpl implements HelloRemote
{
public String sayHello()
{
return "Hallo? Jemand da?";
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
241
5.4.4 Beispiel Hello World ...
Deployment Deskriptor (ejb-jar.xml)
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar/>
➥ Leerer“ Deskriptor
”
➥ Zeigt lediglich an, daß es sich um eine EJB handelt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
242
5.4.4 Beispiel Hello World ...
Client (OpenEJB)
import org.Hello.*;
import java.util.Properties;
import javax.naming.InitialContext;
public class HelloClient {
public static void main(String args[]) {
try {
// Properties für JNDI (hier: Nutzung von OpenEJB)
Properties p = new Properties();
p.put("java.naming.factory.initial",
"org.apache.openejb.client" +
".RemoteInitialContextFactory");
p.put("java.naming.provider.url",
"ejbd://127.0.0.1:4201");
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
243
5.4.4 Beispiel Hello World ...
Client (OpenEJB) ...
// User und Passwort sind optional!
p.put("java.naming.security.principal", "user");
p.put("java.naming.security.credentials", "password");
InitialContext ctx = new InitialContext(p);
Object obj = ctx.lookup("HelloImplRemote");
HelloRemote hello = (HelloRemote)obj;
System.out.println(hello.sayHello());
System.out.println(hello.sayHello());
}
catch (Exception e) { ... }
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (8/15)
244
Client/Server-Programmierung
WS 2014/2015
21.11.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
ix
5.4.5 Einschub: OpenEJB
Nutzung von OpenEJB im Labor H-A 4111
➥ Private Installation (i.w. Konfigurationsdateien):
➥ Auf einem Rechner im Labor H-A 4111: Aufruf des Skripts
/opt/dist/tools/openejb_install.sh
➥
➥
erzeugt private Verzeichnisse für Deployment der EJBs
editiert Konfigurationsdateien so, daß jeder Benutzer
unterschiedliche Ports nutzt
➥ Umgebungsvariable und Pfad setzen (in $HOME/.profile):
export OPENEJB_HOME=$HOME/Soft/openejb-3.1.1
export PATH=$OPENEJB_HOME/bin:$PATH
➥ Start des Containers: openejb start
➥ Stoppen des Containers: ^C oder kill
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
245
5.4.5 Einschub: OpenEJB ...
Übersetzung / Deployment des Servers
➥ Übersetzung
➥ javac -cp $OPENEJB_HOME/lib/javaee-api-5.0-2.jar:.
org/Hello/*.java
➥ CLASSPATH muß nur gesetzt werden, wenn Java EE nicht
installiert ist (wegen EJB-Klassen)
➥ Erzeugung der JAR-Datei für die EJB
➥ jar cvf myHelloEjb.jar org/Hello/*.class META-INF
➥ Verzeichnis META-INF muß Deployment-Deskriptor
ejb-jar.xml enthalten
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
246
5.4.5 Einschub: OpenEJB ...
Übersetzung / Deployment des Servers ...
➥ Deployment der EJB
➥ openejb deploy -s ejbd://localhost:4201 myHelloEjb.jar
➥ OpenEJB-Container muß bereits laufen
➥
ggf. vorher starten: openejb start
➥ Optionen:
➥
➥
➥
-s: Angabe der URL des OpenEJB-Daemons
➥ z.Zt. nur localhost erlaubt
➥ kann entfallen, wenn Standard-Port 4201 benutzt wird
-u: Undeploy und anschließendes Deploy
-o: offline-Modus (wenn OpenEJB-Container nicht läuft)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
247
5.4.5 Einschub: OpenEJB ...
Übersetzung / Deployment des Servers ...
➥ Was passiert beim Deployment?
➥ JAR-Datei mit Bean wird in apps-Verzeichnis von OpenEJB
kopiert (damit Container sie findet)
➥ Business-Interface der Bean wird beim Namensdienst
registriert
➥ genauer: Objekt einer Klasse, die Interface implementiert
➥ Stub- und Implementierungsklassen werden dynamisch zur
Laufzeit erzeugt
➥ Undeployment
➥ openejb undeploy -s ejbd://localhost:4201
$OPENEJB_HOME/apps/myHelloEjb.jar
➥ bzw. falls Container nicht läuft:
rm $OPENEJB_HOME/apps/myHelloEjb.jar
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
248
5.4.5 Einschub: OpenEJB ...
Übersetzung / Start des Clients
➥ Vorbereitung
➥ Java-Datei für Business-Interface muß beim Client vorhanden
sein!
➥ Übersetzung
➥ javac -cp $OPENEJB_HOME/lib/javaee-api-5.0-2.jar:.
HelloClient.java
➥ Start
➥ java -cp $OPENEJB_HOME/lib/javaee-api-5.0-2.jar:
$OPENEJB_HOME/lib/openejb-client-3.1.1.jar:.
HelloClient
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
249
5.4.5 Einschub: OpenEJB ...
Ablauf des Programms
Client
Container−
System
Name
Service
EJB−
Objekt
Container
Class.newInstance()
bind()
lookup()
sayHello()
Class.newInstance()
Bean−
Instanz
sayHello()
sayHello()
Roland Wismüller
Betriebssysteme / verteilte Systeme
sayHello()
Client/Server-Programmierung (9/15)
250
5.4.5 Einschub: OpenEJB ...
Weitere Informationen
➥ OpenEJB Home Page
➥ http://openejb.apache.org/
➥ Dokumentation zu OpenEJB
➥ http://openejb.apache.org/3.0/
➥ Dokumentation zu OpenJPA
➥ http://openjpa.apache.org/builds/1.1.0/
apache-openjpa-1.1.0/docs/manual/
➥ OpenJPA ist der Standard Persistence Provider von OpenEJB
➥ für Entities
➥ EJB 3.0 Spezifikationen
➥ http://jcp.org/aboutJava/communityprocess/final/
jsr220/
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
251
5.4 Enterprise Java Beans (EJB 3.0) ...
5.4.6 Dienste des EJB-Containers
➥ Ressourcen-Management
➥ Pooling: Container hält einen Pool von Bean-Instanzen vor
➥
➥
z.B. bei stateless Session Beans: Aufrufe gehen an
beliebige Instanz im Pool
Ziel u.a.: vermeide teuren Auf- und Abbau von DatenbankVerbindungen
➥ Passivierung und Aktivierung von stateful Session Beans
➥
Container kann Session Beans temporär passivieren
➥ z.B. wenn zuviele Bean-Instanzen vorhanden sind
➥ bei Passivierung wird Zustand der Bean auf Festplatte
gesichert und Bean-Instanz gelöscht
➥ bei nächster Client-Anfrage: neue Bean-Instanz wird
erzeugt und initialisiert
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
252
5.4.6 Dienste des EJB-Containers ...
➥ Namensdienst: Zugriff über JNDI-Schnittstelle
➥ Nebenläufigkeit
➥ Session Beans: immer nur von einem Client genutzt
➥ Entities: optimistisches Locking
➥
➥
setzt Versions-Attribut in der Entity voraus
Alternative: explizite Read und Write-Locks
➥ Persistenz (☞ 5.4.9)
➥ Datenfelder einer Entity werden automatisch mit dem Inhalt
einer Datenbank synchronisiert
➥ Transaktionen (☞ 5.4.10)
➥ Methoden von Session Beans können automatisch als
Transaktionen ausgeführt werden
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
253
5.4.6 Dienste des EJB-Containers ...
➥ Sicherheit
➥ Authentifizierung
➥
➥
Vorgehen abhängig von EJB-Container-Implementierung
oft: Benutzername / Paßwort als Properties über JNDI
übergeben
➥ Autorisierung
➥
➥
Festlegung, wer welche Methoden aufrufen darf
➥ über Deployment-Deskriptor (☞ 5.4.7) oder
Annotationen
rollenbasierte Zugriffskontrolle
➥ sichere Kommunikation
➥
➥
abhängig von EJB-Container-Implementierung
meist: Nutzung von TLS/SSL
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
254
5.4 Enterprise Java Beans (EJB 3.0) ...
5.4.7 Der Deployment-Deskriptor ejb-jar.xml
➥ Beschreibt
➥ aus welchen Klassen die EJB besteht
➥ wie die EJB zur Laufzeit verwaltet werden soll, z.B.:
➥ Art der EJB
➥ Transaktionsmanagement
➥ Zugriffskontrolle
➥ Ab EJB 1.1 ist der Deployment-Deskriptor in XML codiert
➥ wird als META-INF/ejb-jar.xml in JAR-Datei der EJB
abgelegt
➥ wird beim Deployment vom Container gelesen
➥ Ab EJB 3.0 kann Deployment-Deskriptor auch leer sein
➥ Metadaten auch als Annotationen im Java-Code möglich
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
255
5.4.7 Der Deployment-Deskriptor ejb-jar.xml ...
Aufbau des Deployment-Deskriptors
➥ Prinzipieller Aufbau:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar>
<enterprise-beans>
...
</enterprise-beans>
<assembly-descriptor>
...
</assembly-descriptor>
</ejb-jar>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
256
5.4.7 Der Deployment-Deskriptor ejb-jar.xml ...
Elemente innerhalb von <ejb-jar>
➥ <enterprise-beans>
➥ Beschreibung der einzelnen EJBs innerhalb der JAR-Datei
➥ ab EJB 3.0 besser durch Annotationen
➥ <assembly-descriptor>
➥ Konfiguration der zusammengestellten Beans für eine
Anwendung
➥ z.B. Transaktionsverhalten, Zugriffskontrolle
➥ <description>
➥ Beschreibung der Beans-Sammlung in der JAR-Datei
➥ und noch einige weitere ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
257
5.4.7 Der Deployment-Deskriptor ejb-jar.xml ...
Elemente innerhalb von <assembly-descriptor>
➥ <container-transaction>
➥ Transaktions-Attribute für einzelne Methoden (☞ 5.4.10)
➥ ab EJB 3.0 auch besser durch Annotationen
➥ <security-role>
➥ Definiert Rollennamen für rollenbasierte Zugriffskontrolle
➥ Unterelemente: <description> und <role-name>
➥ <method-permission>
➥ legt fest, welche Rollen welche Methoden aufrufen dürfen
➥ Unterelemente: <description>, <role-name>, <method>
➥ statt <role-name> auch Element <unchecked> möglich: keine
Zugriffskontrolle
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
258
5.4.7 Der Deployment-Deskriptor ejb-jar.xml ...
Zur Zugriffskontrolle bei EJBs
➥ Deployment-Deskriptor (bzw. Annotationen) legt nur Abbildung
zwischen Rollennamen und aufrufbaren Methoden fest
➥ Verwaltung von Benutzern und Paßworten sowie Abbildung von
Benutzern auf Rollen muß durch EJB-Container erfolgen
➥ abhängig von jeweiliger Implementierung
➥ in OpenEJB 3.1:
➥
➥
conf/users.properties: Benutzer und Paßwort
➥ z.B.: roland=myPassWd
conf/groups.properties: Zuordnung Benutzer zu Rollen
➥ z.B.: Admin=roland
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
259
5.4.7 Der Deployment-Deskriptor ejb-jar.xml ...
Beispiel
➥ Session Bean zur Vorlesungsverwaltung
➥ jeder darf die Daten lesen, nur Administrator darf ändern
➥ Deployment-Deskriptor:
<ejb-jar>
<assembly-descriptor>
<security-role>
<description>Rolle fuer Administratoren</description>
<role-name>Admin</role-name>
</security-role>
<method-permission>
<role-name>Admin</role-name>
<method>
<ejb-name>VorlesungEJB</ejb-name>
<method-name>*</method-name>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
260
5.4.7 Der Deployment-Deskriptor ejb-jar.xml ...
</method>
</method-permission>
<method-permission>
<unchecked/>
<method>
<ejb-name>VorlesungEJB</ejb-name>
<method-name>getInfos</method-name>
</method>
</method-permission>
</assembly-descriptor>
</ejb-jar>
➥ Anmerkungen:
➥ der Deployment-Deskriptor wird i.d.R. über ein Konfigurations-
werkzeug erstellt
➥ Rollen und Zugriffsrechte können auch über Annotationen
festgelegt werden
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
261
5.4 Enterprise Java Beans (EJB 3.0) ...
5.4.8 Session Beans: Details
Stateless Session Beans
➥ Container verwaltet Pool
identischer Bean-Instanzen
➥ Erzeugung / Löschung
nur durch Container
➥ Aufrufe von Anwendungsmethoden werden an
beliebige Bean-Instanz im
Pool geleitet
➥ keine Passivierung /
Aktivierung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Stateful Session Beans
➥ Erzeugung / Löschung (indirekt)
auf Veranlassung des Clients
➥ Bean-Instanzen werden ClientSitzungen (und damit EJBObjekten) fest zugeordnet
➥ Aufrufe eines Clients gehen
an dieselbe Bean-Instanz
➥ bei Bedarf: Passivierung /
Aktivierung durch Container
Client/Server-Programmierung (9/15)
262
5.4.8 Session Beans: Details ...
Annotationen für Schnittstellen und Bean-Implementierungen
➥ @Local und @Remote (aus javax.ejb)
➥ markieren ein Java-Interface als lokale bzw. remote
Schnittstelle einer EJB
➥ lokale Schnittstelle kann nur innerhalb des Containers (von
anderen EJBs) genutzt werden
➥ Zuordnung zur Bean-Klasse über implements-Beziehung
➥ @Stateless und @Stateful (aus javax.ejb)
➥ markieren eine Java-Klasse als entsprechende Session Bean
➥ @Remove (aus javax.ejb)
➥ markiert eine Methode in einer (stateful) Session Bean-
Klasse, nach deren Ausführung die Bean-Instanz gelöscht
werden soll
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
263
5.4.8 Session Beans: Details ...
Beispiel
➥ RemIf.java:
➥
@Remote
public interface RemIf {
public String sayHello();
public void bye();
}
LocIf.java:
@Local
public interface LocIf {
public String sayHello();
public void doIt();
}
➥ MyBean.java:
@Stateful
public class MyBean implements LocIf, RemIf {
public String sayHello() { ... }
@Remove public void bye() { ... }
public void doit() { ... }
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
264
5.4.8 Session Beans: Details ...
Lebenszyklus-Callbacks
➥ @PostConstruct bzw. @PreDestroy (aus javax.annotation)
➥ markiert Methode in einer Bean-Klasse, die nach Erzeugung
bzw. vor Löschung einer Bean-Instanz aufgerufen werden soll
➥ aber: keine Garantie, daß Bean-Instanz jemals gelöscht wird
➥ @PrePassivate bzw. @PostActivate (aus javax.ejb)
➥ markiert Methode, die vor Passivierung bzw. nach Aktivierung
einer Bean-Instanz aufgerufen werden soll
➥ Alle Callback-Methoden sollten wie folgt deklariert werden:
➥ public void name () { ... }
➥ Auch möglich: Definition einer eigenen Klasse für die Callbacks
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
265
5.4.8 Session Beans: Details ...
Interceptor-Methoden
➥ @AroundInvoke (aus javax.interceptor)
➥ markiert Methode, die alle Methodenaufrufe einer Bean
abfängt
➥ Deklaration der Methode:
➥
public Object name (InvocationContext c)
throws Exception { ... }
➥ InvocationContext erlaubt u.a.:
➥
➥
Abfrage von Zielobjekt, Methodenname und Parameter
Ausführung des abgefangenen Methodenaufrufs
➥ Einsatz z.B. Protokollierung, Zugriffskontrolle, ...
➥ Auch möglich: Definition einer eigenen Klasse für den Interceptor
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
266
5.4.8 Session Beans: Details ...
Dependency Injection
➥ Aufgabe: Beschaffung von Referenzen auf Ressourcen, die der
Container bereitstellt
➥ Lösung: passendes Attribut wird mit einer Annotation versehen
➥ Attribut wird dann automatisch vom Container initialisiert
➥ @Resource (aus javax.annotation)
➥ für beliebige Resourcen des Containers
➥ z.B. SessionContext: erlaubt Zugriff auf Benutzer-Name,
aktuelle Transaktion, ...
➥ @EJB (aus javax.ejb)
➥ speziell, um Referenzen auf EJBs zu holen
➥ (Alternative: explizite Nutzung von JNDI)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
267
5.4.8 Session Beans: Details ...
Beispiel
➥ MyBeanLocal.java:
@Local public interface MyBeanLocal {
public String getName();
}
➥ MyBean.java:
@Stateful
public class MyBean implements MyBeanLocal {
// Attribut wird vom Container initialisiert!
@Resource private SessionContext context;
public String getName() {
return context.getCallerPrincipal().getName();
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
268
5.4.8 Session Beans: Details ...
Beispiel ...
➥ HelloRemote.java:
@Remote public interface HelloRemote {
public String sayHello();
public String sayGoodBye();
}
➥ HelloImpl.java:
@Stateful
public class HelloImpl implements HelloRemote {
// Referenz auf MyBean wird vom Container eingetragen!
@EJB private MyBeanLocal myBean;
public String sayHello() {
return "Hallo " + myBean.getName();
}
@Remove public String sayGoodBye() { ... }
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
269
5.4.8 Session Beans: Details ...
Beispiel ...
➥ HelloImpl.java ...:
@PostConstruct public void start() {
System.out.println("@PostConstruct HelloImpl");
}
@PreDestroy public void stop() {
System.out.println("@PreDestroy HelloImpl");
}
@AroundInvoke
public Object inv(InvocationContext c)
throws Exception {
System.out.println("HelloImpl: Calling "
+ c.getMethod().getName());
return c.proceed();
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (9/15)
270
5.4.8 Session Beans: Details ...
Lebenszyklus einer Stateless Session Bean
Container entscheidet,
daß mehr Bean−Instanzen
im Pool benötigt werden,
um Clients zu bedienen
Beliebiger Client
ruft Anwendungs−
methode auf. Abar−
beitung in beliebiger
EBJ.
Bean−Instanz
existiert nicht
1. Class.newInstance()
2. Injections
3. @PostConstruct
Anwendungs−
methode
Roland Wismüller
Betriebssysteme / verteilte Systeme
Container entscheidet,
daß nicht mehr so
viele Bean−Instanzen
benötigt werden
@PreDestroy
Pool äquivalenter
Instanzen, bereit
für Methodenaufrufe
Client/Server-Programmierung (9/15)
271
5.4.8 Session Beans: Details ...
Typische Abläufe bei Stateless Session Beans
Client
EJB−
Objekt
Hinzufügen einer
neuen Instanz
zum Pool
Methodenaufrufe
durch Client
businessMethod()
Löschen
einer Instanz
aus dem Pool
Roland Wismüller
Betriebssysteme / verteilte Systeme
Container−
System Container
Class.newInstance() Bean−
Instanz
Injections
@PostConstruct
businessMethod()
@PreDestroy
Client/Server-Programmierung (9/15)
272
5.4.8 Session Beans: Details ...
Lebenszyklus einer Stateful Session Bean
Client holt/nutzt
Referenz auf ein
Interface der
Session Bean
Client ruft Methode
auf, die mit @Remove
annotiert ist
oder: Timeout
Bean−Instanz
existiert nicht
1. Class.newInstance()
@PreDestroy
2. Injections
3. @PostConstruct
Anwendungs−
methode
Client ruft
Anwendungs−
methode der
Session Bean
Bereit
Timeout
@PrePassivate
Passiv
@PostActivate
Limit instantiierter
Beans ist erreicht.
Container muß
Bean auslagern
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client ruft Methode
der passivierten
Bean. Container muß
Bean wieder einlagern
Client/Server-Programmierung (9/15)
273
Client/Server-Programmierung
WS 2014/2015
28.11.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
x
5.4.8 Session Beans: Details ...
Erzeugung/Löschung einer Stateful Session Bean
Client
Name Service
Container
lookup()
Container−
System
EJB−
Class.
newInstance() Objekt Class.newInstance() Bean−
Instanz
Injections
Erzeugung
@PostConstruct
EJB−Objekt
businessMethod()
businessMethod()
@Remove businessMethod2()
businessMethod2()
Löschung
Roland Wismüller
Betriebssysteme / verteilte Systeme
@ PreDestroy
Client/Server-Programmierung (10/15)
274
5.4.8 Session Beans: Details ...
Passivierung/Aktivierung einer Stateful Session Bean
Client
EJB−Objekt
Container
Container −
System
Passivierung
businessMethod()
Aktivierung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Bean−Inst.
Festplatte
@PrePassivate
serialisiere Bean−Instanz
speichere Zustand ab
Class.newInstance()
Bean−Inst.
Lies Zustand ein
deserialisiere Bean−Instanz
@PostActivate
businessMethod()
Client/Server-Programmierung (10/15)
275
5.4 Enterprise Java Beans (EJB 3.0) ...
5.4.9 Entities: Details
➥ Entities realisieren persistente Datenobjekte einer Anwendung
➥ Basis: Java Persistence API (JPA)
➥ unabhängig von EJB und Java EE nutzbar
➥ Eigenschaften (Abgrenzung zu Session Beans):
➥ für den Client sichtbare, persistente Identität (Primärschlüssel)
➥
unabhängig von Objektreferenz
➥ persistenter, für Client sichtbarer Zustand
➥ nicht entfernt zugreifbar
➥ Lebensdauer völlig unabhängig von der der Anwendung
➥ Persistenz der Entities wird automatisch durch Persistence
Provider gesichert
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
276
5.4.9 Entities: Details ...
Beispiel
➥ Entity Account.java:
import javax.persistence.*;
@Entity // Markiert Klasse als Entity
public class Account implements java.io.Serializable {
@Id // Markiert Attribut als Primärschlüssel
private int accountNo;
private String name;
public int getAccountNo() { return accountNo; }
public String getName() { return name; }
public void setName(String nm) { name = nm; }
public Account(int no, String nm) {
accountNo = no; name = nm;
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
277
5.4.9 Entities: Details ...
Beispiel ...
➥ Deployment-Deskriptor META-INF/persistence.xml:
<persistence
xmlns="http://java.sun.com/xml/ns/persistence"
version="1.0">
<persistence-unit name="intro">
<jta-data-source>My DataSource</jta-data-source>
<non-jta-data-source>My Unmanaged DataSource
</non-jta-data-source>
<class>org.Hello.Account</class>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings"
value="buildSchema(ForeignKeys=true)"/>
</properties>
</persistence-unit>
</persistence>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
278
5.4.9 Entities: Details ...
Beispiel ...
➥ OpenEJB Konfigurationsdatei conf/openejb.xml:
<Resource id="My DataSource" type="DataSource">
JdbcDriver org.hsqldb.jdbcDriver
JdbcUrl jdbc:hsqldb:file:data/hsqldb/hsqldb
UserName sa
Password
JtaManaged true
</Resource>
<Resource id="My Unmanaged DataSource" type="DataSource">
JdbcDriver org.hsqldb.jdbcDriver
JdbcUrl jdbc:hsqldb:file:data/hsqldb/hsqldb
UserName sa
Password
JtaManaged false
</Resource>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
279
5.4.9 Entities: Details ...
Anmerkungen zum Beispiel
➥ Eine Entity -Klasse muss Serializable nicht implementieren
➥ falls Sie es tut, können Objekte auch als Parameter / Ergebnis
von Remote-Methoden einer Session Bean auftreten
➥ übergeben wird dabei eine Kopie, die nicht mit der
Datenbank synchronisiert wird
➥ Abbildung von Klasse auf Datenbank-Tabelle und von Attributen
auf Spalten wird vom Persistence Provider vorgenommen
➥ kann durch Annotationen genau gesteuert werden
➥ Entity -Klasse muß ein Primärschlüssel-Attribut deklarieren (@Id)
➥ Primärschlüssel kann auch eigene Klasse sein
➥ Entity -Klasse darf auch Geschäftsmethoden besitzen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
280
5.4.9 Entities: Details ...
Anmerkungen zum Beispiel ...
➥ Beispiel verwendet Field Access
➥ Persistence Provider greift direkt auf die Attribute zu
➥ Mapping-Annotationen (hier: @Id) bei den Attributen
➥ Alternative: Property Access
➥ Persistence Provider greift auf den Zustand nur über get- und
set-Methoden zu
➥ Mapping-Annotationen bei den get-Methoden
➥ Achtung: es müssen immer get- und set-Methoden
implementiert werden
➥ Pro Entity ist nur eine der Alternativen erlaubt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
281
5.4.9 Entities: Details ...
Anmerkungen zum Beispiel ...
➥ Deployment-Deskriptor legt fest:
➥ Name der Persistence Unit (zum Zugriff durch Session Bean)
➥
Persistence Unit: Einheit für Kapselung und Deployment
von Entities
➥ Namen der Datenquellen mit bzw. ohne Support für Java
Transaction API (JTA, ☞ 5.4.10)
➥ Properties für den Persistence Provider
➥
hier: OpenJPA passt Datenbank-Schema zur Laufzeit an
➥ OpenEJB-Konfiguration legt fest:
➥ JDBC Treiber und URL der Datenbank (☞ 2)
➥ Login-Name und Passwort
➥ Unterstützung für JTA
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
282
5.4.9 Entities: Details ...
Beispiel zur Nutzung der Entity in einer Session Bean
➥ Remote-Schnittstelle BankRemote.java:
import javax.ejb.Remote;
@Remote
public interface BankRemote
{
public Account create(int n, String name);
public String getName(int n);
public void close(int n);
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
283
5.4.9 Entities: Details ...
Beispiel zur Nutzung der Entity in einer Session Bean ...
➥ Bean-Implementierung BankImpl.java:
import javax.ejb.*;
import javax.persistence.*;
@Stateless
public class BankImpl implements BankRemote {
// Dependency Injection: Entity Manager für Persistenz−Einheit ’intro’
@PersistenceContext(unitName="intro")
private EntityManager manager;
public Account create(int n, String name) {
Account acc = new Account(n, name);
// Objekt ab jetzt durch Persistence Provider verwalten
manager.persist(acc);
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
284
5.4.9 Entities: Details ...
Beispiel zur Nutzung der Entity in einer Session Bean ...
➥ Bean-Implementierung BankImpl.java:
// Rückgabewert ist eine losgelöste Kopie des Objekts!
return acc;
}
public String getName(int n) {
// Findet Objekt mit gegebenem Primärschlüssel
Account acc = manager.find(Account.class, n);
return acc.getName();
}
public void close(int n) {
Account acc = manager.find(Account.class, n);
// Datenbank−Eintrag löschen
manager.remove(acc);
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
285
5.4.9 Entities: Details ...
Beispiel zur Nutzung der Entity in einer Session Bean ...
➥ Client BankClient.java:
...
Object obj = ctx.lookup("BankImplRemote");
BankRemote bank = (BankRemote)obj;
// Erzeugt neue Entity (und Datenbankeintrag)
Account acc = bank.create(n, args[1]);
// acc ist eine Kopie des Eintrags, lokale Methodenaufrufe
System.out.println(acc.getName());
acc.setName("Niemand");
// Remote−Aufrufe der Entity Bean
System.out.println(bank.getName(n));
bank.close(n);
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
286
5.4.9 Entities: Details ...
Persistence Context
➥ Verbindung zwischen Instanzen im Speicher und der Datenbank
➥ Methoden der Schnittstelle EntityManager u.a.:
➥ void persist(Object entity)
➥ Instanz verwalten und persistent machen
➥ <T> T find(Class<T> entityClass, Object primaryKey)
➥ Instanz zu gegebenem Primärschlüssel suchen
➥ void remove(Object entity)
➥ Instanz aus der Datenbank löschen
➥ void refresh(Object entity)
➥ Instanz aus Datenbank neu laden
➥ <T> T merge(T entity)
➥ Zustand der Instanz in Persistence Context hineinmischen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
287
5.4.9 Entities: Details ...
Lebenszyklus einer Entity
new
refresh()
new
persist()
remove()
managed
removed
Persistence
Context
endet
merge()
persist()
detached
Instanz wird mit Daten−
bank konsistent gehalten
Roland Wismüller
Betriebssysteme / verteilte Systeme
Instanz hat Datenbank−Eintrag,
ist aber nicht mit Persistence
Context verbunden (z.B.
Kopie einer managed Entity)
Client/Server-Programmierung (10/15)
288
5.4.9 Entities: Details ...
Lebenszyklus einer Entity ...
➥ Persistence Context endet per Voreinstellung mit dem Ende der
aktuellen Transaktion
➥ Einstellung über Attribut type von @PersistenceContext
➥ Synchronisation mit Datenbank i.a. am Ende jeder Transaktion
➥ einstellbar über setFlushMode() Methode von EntityManager
➥ ggf. auch explizite Synchronisation durch Methode flush()
➥ JPA verwendet standardmäßig ein optimistisches Sperrprotokoll
➥ Datensätze werden nicht gesperrt
➥ bei gleichzeitigen Änderungen durch zwei Transaktionen wird
eine davon zurückgesetzt
➥ dazu notwendig: Versionsattribut (Annotation @Version)
➥ Lebenszyklus-Callbacks analog zu Session Beans möglich
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
289
5.4.9 Entities: Details ...
Finden von Entities
➥ EntityManager erlaubt das Finden von Datensätzen über
Queries in SQL und EJB-QL
➥ EJB-QL ist SQL-ähnlich, aber portabel
➥ Beispiel:
Query query
= manager.createQuery("SELECT a FROM Account a");
List<Account> result = query.getResultList();
➥ Queries können auch mit Namen vordefiniert werden
➥ über Annotation @NamedQuery der Entity
➥ als named-query Element im Deskriptor META-INF/orm.xml
➥ Nutzung: query = manager.createNamedQuery("myQuery");
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
290
5.4.9 Entities: Details ...
Abbildung zwischen Objekten und Relationen (OR-Mapping)
➥ Default-Verhalten:
➥ jede Entity bekommt eine Tabelle
➥ jedes Attribut bekommt eine Tabellen-Spalte
➥ Namen werden in Großbuchstaben umgewandelt
➥ Verhalten anpaßbar über Annotationen (bzw. XML-Deskriptor), z.B.:
➥ @Table(name="..."): Tabellenname für Entity
➥ @Column(name="..."): Spaltenname für Attribut
➥ @Transient: Attribut wird nicht persistent gemacht
➥ Auch Abbildung von Assoziationen zwischen Klassen durch
entsprechende Annotationen möglich
➥ u.a. @OneToMany, @ManyToOne, @JoinColumn, siehe Beispiel
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
291
5.4.9 Entities: Details ...
Beispiel zum OR-Mapping
➥ Datenbank-Tabellen für Konto und Zahlungen:
KONTO
KONTO_NR: INTEGER NAME: VARCHAR(255)
BUCHUNG
ID: INTEGER BETRAG: NUMERIC DATUM: TIMESTAMP KONTO: INTEGER
➥ Klassendiagramm für die Entities:
Payment
Account
accountNo: int
name: String
Roland Wismüller
Betriebssysteme / verteilte Systeme
payments
1
id: int
date: Date
* amount: double
Client/Server-Programmierung (10/15)
292
5.4.9 Entities: Details ...
Beispiel zum OR-Mapping ...
➥ Entity -Klasse Account.java
@Entity
@Table(name="KONTO")
public class Account {
@Id
@Column(name="KONTO_NR")
private int accountNo;
private String name;
@OneToMany(fetch=FetchType.LAZY, mappedBy="account")
private Set<Payment> payments;
public int getAccountNo() { return accountNo; }
public Set<Payment> getPayments() { return payments; }
public void addPayment(Payment p) { payments.add(p); }
...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
293
5.4.9 Entities: Details ...
Beispiel zum OR-Mapping ...
➥ Entity -Klasse Payment.java
@Entity
@Table(name="BUCHUNG")
public class Payment {
@Id
private int id;
@ManyToOne
@JoinColumn(name="KONTO", nullable=false)
private Account account;
@Column(name="DATUM")
private Date date;
@Column(name="BETRAG")
private double amount;
...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
294
5.4.9 Entities: Details ...
Anmerkungen zum Beispiel
➥ Bedeutung des Parameters type bei @OneToMany:
➥ EAGER: Payments werden beim Laden eines Account-Objekts
sofort mitgeladen
➥ LAZY: Payments werden erst beim Zugriff geladen
➥ Zugriff muß über get-Methode (getPayments()) erfolgen!
➥ mappedBy-Parameter von @OneToMany realisiert eine bidirektionale
Assoziation
➥ @JoinColumn definiert, welche Spalte der Tabelle BUCHUNG den
Primärschlüssel des zugehörigen Eintrags in KONTO enthält
➥ nullable gibt an, ob der Spalteneintrag leer sein darf
➥ Deskriptor META-INF/persistence.xml muss <class>-Tags für
beide Entities enthalten
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (10/15)
295
Client/Server-Programmierung
WS 2014/2015
05.12.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
xi
5.4 Enterprise Java Beans (EJB 3.0) ...
5.4.10 Transaktionen
➥ EJB-Container bieten Unterstützung für flache (evtl. verteilte)
Transaktionen
➥ EJB-Container kann
➥ automatisch Transaktionen um Client-Anfragen generieren
➥ vom Client oder einer EJB explizit definierte Transaktions-
Grenzen erkennen und an EJBs weitergeben
➥ EJB-Container regelt Weitergabe von Transaktionen bei
Methodenaufrufen
➥ z.B. wenn innerhalb einer Transaktion eine Methode gerufen
wird, die neue Transaktion definiert
➥ verschachtelte Transaktionen sind nicht erlaubt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
296
5.4.10 Transaktionen ...
Arten des Transaktions-Managements
➥ Festlegung durch Annotation der Session Bean
➥ @TransactionManagement (aus javax.ejb)
➥ Argument: TransactionManagementType.BEAN bzw.
CONTAINER
➥ Bean Managed Transactions
➥ Session Bean legt Transaktionsgrenzen selbst fest
➥ Container Managed Transactions
➥ Container legt Grenzen und Weitergabe von Transaktionen fest
➥ Verhalten durch Annotation der Methoden spezifiziert
➥ @TransactionAttribute (aus javax.ejb)
➥ Client Initiated Transactions
➥ Transaktionsgrenzen werden vom Client bestimmt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
297
5.4.10 Transaktionen ...
Bean Managed und Client Initiated Transactions mit JTA
➥ Verwendung des Java Transaction API (JTA)
➥ Klasse javax.transaction.UserTransaction
➥ Methoden begin(), commit(), rollback()
➥ Erzeugung eines UserTransaction-Objekts
➥ Im Client (oder einer Session Bean): über JNDI
➥
ut = (UserTransaction)ctx.lookup(
"java:comp/env/UserTransaction");
➥ In einer Session Bean:
➥
➥
über SessionContext: Methode getUserTransaction()
oder direkt über Dependency Injection:
➥ @Resource private UserTransaction ut;
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
298
5.4.10 Transaktionen ...
Container Managed Transactions: Beispiel Ticket-Buchung
import javax.ejb.*;
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class TravelAgentBean implements TravelAgentRemote {
...
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Ticket bookPassage(CreditCard card, double price) {
try {
Reservation res = new Reservation(customer, cruise, price);
entityManager.persist(res);
pay.byCredit(customer, card, price);
return new Ticket(customer, cruise, price);
}
catch (Exception e) { throw new EJBException(e); }
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
299
5.4.10 Transaktionen ...
Transaktionsverhalten des Beispiels
➥ Abarbeitung von bookPassage() soll immer innerhalb einer
Transaktion erfolgen
➥ Transaktionsattribut Required
➥ wenn Aufruf nicht in einer Transaktion erfolgt, wird automatisch
neue Transaktion erzeugt
➥ Transaktion wird an die Methoden der genutzten EJBs weitergegeben
➥ gemäß Transaktionsattribut der gerufenen Methode
➥ Falls bookPassage() eine System-Exception wirft: Rollback,
sonst: Commit am Ende der Methode
➥ alle Unterklassen von RuntimeException sind System-
Exceptions, insbes. EJBException
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
300
5.4.10 Transaktionen ...
Container Managed Transactions: Transaktionsattribute
➥ NOT_SUPPORTED
➥ Methode unterstützt keine Transaktionen
➥ ggf. bereits existierende Transaktion wird bei Aufruf
suspendiert
➥ SUPPORTS
➥ Methode unterstützt Transaktionen, erzeugt aber keine eigene
Transaktion
➥ ggf. bei Aufruf existierende Transaktion wird übernommen
➥ REQUIRED
➥ Methode muß innerhalb einer Transaktion ausgeführt werden
➥ ggf. wird beim Aufruf eine neue Transaktion erzeugt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
301
5.4.10 Transaktionen ...
Container Managed Transactions: Transaktionsattribute ...
➥ REQUIRES_NEW
➥ beim Methodenaufruf wird immer eine neue Transaktion
erzeugt
➥ ggf. bereits existierende Transaktion wird suspendiert
➥ MANDATORY
➥ Methode muß innerhalb einer Transaktion ausgeführt werden
➥ ansonsten wird Exception geworfen
➥ NEVER
➥ Methode darf nicht innerhalb einer Transaktion ausgeführt
werden
➥ ansonsten wird Exception geworfen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
302
5.4.10 Transaktionen ...
Container Managed Transactions: Transaktionsattribute ...
Transaktions−
Attribut
NOT_SUPPORTED
SUPPORTS
REQUIRED
REQUIRES_NEW
MANDATORY
NEVER
Roland Wismüller
Betriebssysteme / verteilte Systeme
Transaktion des
Aufrufers
keine
T1
keine
T1
keine
T1
keine
T1
keine
T1
keine
T1
Transaktion der
gerufenen Methode
keine
keine
keine
T1
T2
T1
T2
T2
Exception
T1
keine
Exception
Client/Server-Programmierung (11/15)
303
5.4 Enterprise Java Beans (EJB 3.0) ...
5.4.11 Zusammenfassung
➥ EJBs: Komponentenmodell für Anwendungsserver
➥ Entities für Datenmodell
➥ Persistenz und Transaktionen durch Container verwaltet
➥ Session Beans für Client-Sitzungen
➥ Transaktionen durch Client, Bean oder Container verwaltet
➥ Container realisiert daneben u.a. Ressourcenmanagement,
Namens- und Sicherheitsdienste
➥ Nicht besprochen: Entity Beans, Message Driven Beans, und
vieles andere mehr ...
➥ Web Services kommt später noch
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
304
Client/Server-Programmierung
WS 2014/2015
6
Servlets und JSP
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
305
6 Servlets und JSP ...
Inhalt
➥ Servlets
➥ Java Server Pages (JSP)
➥ Hunter / Crawford
➥ Farley / Crawford / Flanagan, Kap. 5 und 6
➥ Langner (Verteilte Anwendungen mit Java), Kap. 6
➥ Orfali / Harkey, Kap. 12
➥ http://docs.oracle.com/javaee/5/tutorial/doc/bnadp.html
➥ http://docs.oracle.com/javaee/6/tutorial/doc/bnafd.html
➥ http://www.oracle.com/technetwork/java/javaee/tech
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
306
6 Servlets und JSP ...
6.1 Servlets
➥ Java Software-Komponenten zur dynamischen Erweiterung von
Web-Servern
➥ Erzeugung dynamischer HTML-Seiten, z.B. aus
Datenbank-Inhalten
➥ Typische Architektur:
HTTP GET
HTTP−
Server
Servlet−
Container JDBC
Servlet
HTML−Seite
Web−Browser
Datenbank
Servlet
Web−Server
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
307
6.1 Servlets ...
6.1.1 Grundlagen
➥ Servlets sind Java-Klassen, die innerhalb eines Web-Servers
ausgeführt werden
➥ Web-Server muß servlet-fähig sein, d.h. über einen
Servlet-Container verfügen (z.B. Tomcat)
➥ Container lädt Servlets bei Bedarf dynamisch nach
➥ (HTTP-)Servlets werden (u.a.) über die HTTP-Anfragen GET bzw.
POST angesprochen
➥ Servlet bearbeitet die Anfrage und erzeugt eine HTML-Seite
➥ Bearbeitung erfolgt durch eigenen Thread im Adreßraum des
Web-Servers
➥ (Generische Servlets werden hier nicht behandelt)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
308
6.1.1 Grundlagen ...
Die HTTP-Methoden GET und POST
➥ Teil des HTTP-Protokolls: Browser-Anfragen an den Server
➥ Auch verwendet in HTML-Formularen
➥ GET-Methode
➥ zum Holen von Dokumenten über eine URL bestimmt
➥ URL kann auch weitere Parameter beinhalten, z.B.
➥
GET /buy.html?what=shoe&price=50.00 HTTP 1.0
➥ begrenzte Länge der URL!
➥ POST-Methode
➥ zum Senden von Daten an den Web-Server
➥ Parameter werden im Rumpf der HTTP-Anfrage übertragen,
sind in der URL nicht sichtbar
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
309
6.1.1 Grundlagen ...
Implementierung von HTTP-Servlets
➥ Ableiten einer Klasse von javax.servlet.http.HttpServlet
➥ I.d.R. Überschreiben einer der Methoden
➥ void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
➥
Behandlung von HTTP-GET-Anfragen
➥ void doPost(...): analog für HTTP-POST-Anfragen
➥ Bei Bedarf Überschreiben der Methoden
➥ void init() : gerufen, wenn Servlet geladen wird
➥ void destroy() : gerufen, wenn Servlet entfernt wird
➥ Einige weitere Methoden, siehe API-Dokumentation
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
310
6.1 Servlets ...
6.1.2 Einschub: Web-Server im Labor
➥ Im Labor H-A4111 kann/soll jeder Student einen eigenen
Web-Server verwenden
➥ tomcat-Server (für Servlets, Web-Services, ...)
➥ Private Installation (i.w. Konfigurationsdateien):
➥ Aufruf des Skripts
/opt/dist/tools/tomcat_install.sh
auf einem Rechner im Labor H-A 4111
➥ konfiguriert für jeden Benutzer eigene Ports
➥ Umgebungsvariablen setzen (in $HOME/.profile):
export CATALINA_BASE=$HOME/Soft/apache-tomcat-6.0.18
export CATALINA_HOME=/opt/dist/apache-tomcat-6.0.18
export PATH=$CATALINA_HOME/bin:$PATH
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
311
6.1.2 Einschub: Web-Server im Labor ...
Nutzung von Tomcat
➥ Start des tomcat-Servers mit catalina.sh run
➥ benutzte Port-Nummer wird beim Start ausgegeben:
INFO: Initializing Coyote HTTP/1.1 on http-8080
➥ Web-Seiten können unter $CATALINA_BASE/webapps/ROOT
angelegt werden
➥ Erreichbar dann unter der URL
http://rechnername:port/dateiname
➥ Im Labor H-A 4111 muß wegen des voreingestellten Web-
Proxies immer der vollständige Rechnername (FQDN)
angegeben werden
➥ z.B. bsclk01.lab.bvs
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
312
6.1 Servlets ...
6.1.3 Beispiel: Hello-World Servlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloSrv extends HttpServlet {
private int counter = 0;
// Wird bei HTTP−Get−Anfrage aufgerufen
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
counter++;
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
313
6.1.3 Beispiel: Hello-World Servlet ...
// Extrahiert Parameter ’name’ aus URL
String name = request.getParameter("name");
response.setContentType("text/html");
// Ausgabestrom für die erzeugte HTML−Seite
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Hallo World</title></head>");
out.println("<body><b>" + counter + ". Hello to " + name +
"!</b></body>");
out.println("</html>");
out.close();
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
314
6.1.3 Beispiel: Hello-World Servlet ...
HTML-Seite zum Aufruf des Servlets
<HTML>
<HEAD><TITLE>Hello-World</TITLE></HEAD>
<BODY>
<P>
<A HREF="http://localhost:8080/test/hello?name=Roland">
Say Hello to Roland</A>
</P>
<P> Say Hello to:
<FORM METHOD="GET"
ACTION="http://localhost:8080/test/hello">
<INPUT TYPE="text" NAME="name" SIZE="10">
<INPUT TYPE="submit" VALUE="Submit">
</FORM>
</P>
</BODY>
</HTML>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
315
6.1.3 Beispiel: Hello-World Servlet ...
Deployment mit Tomcat-Server
➥ Übersetzen des Servlets
➥ javac -cp $CATALINA_HOME/lib/servlet-api.jar:.
HelloSrv.java
➥ CLASSPATH nur notwendig, wenn J2EE nicht installiert ist
➥ Erstellen eines Deployment-Deskriptors unter WEB-INF/web.xml
➥ Kopieren der class-Datei(en) nach WEB-INF/classes
➥ cp HelloSrv.class WEB-INF/classes
➥ Erzeugen eines WAR Archivs
➥ jar -cvf test.war WEB-INF
➥ Kopieren des WAR Archivs in das Tomcat-Verzeichnis
➥ cp test.war $CATALINA_BASE/webapps
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
316
6.1.3 Beispiel: Hello-World Servlet ...
Deployment-Deskriptor für das Servlet
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloSrv</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
317
6.1.3 Beispiel: Hello-World Servlet ...
Deployment mit Tomcat-Server ...
➥ Servlet ist nun unter dieser URL ansprechbar:
➥ http://localhost:8080/test/hello
➥ HTML-Datei zum Aufruf des Servlets kann z.B. nach
$CATALINA_BASE/webapps/ROOT/hello.html kopiert werden
➥ URL dann http://localhost:8080/hello.html
➥ Anmerkungen:
➥ Servlet-Klassen dürfen nicht im CLASSPATH von Tomcat sein!
➥ Tomcat nie im Verzeichnis starten, in dem die ServletKlassen liegen!
➥ Tomcat 6.0 kann beim Deployment auch laufen
➥ WAR Archiv wird bei Änderung erneut ausgepackt, Klassen
werden neu geladen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
318
6.1 Servlets ...
6.1.4 Lebenszyklus eines Servlets
➥ Beim Start des Servers oder durch Client-Anfrage:
➥ Servlet-Klasse wird in Web-Server geladen
➥ eine Instanz der Servlet-Klasse wird erzeugt
➥ die init()-Methode wird aufgerufen
➥ Bei einer HTTP-Anfrage:
➥ Erzeugung eines neuen Threads, der die Methode doGet()
bzw. doPost() ausführt
➥ Implementierung der Methoden muß thread-sicher sein!
➥ Bei Entfernung des Servlets aus dem Server
➥ Aufruf der Methode destroy()
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
319
6.1 Servlets ...
6.1.5 Wichtige Klassen und Methoden
➥ HttpServletRequest: HTTP-Anfrage
➥ String getParameter(String name)
➥
➥
liefert Wert des genannten Anfrage-Parameters
z.B. bei GET /buy.html?what=shoe HTTP 1.0
➥ HttpSession getSession()
➥
liefert bzw. erzeugt Sitzungs-Objekt (☞ 6.1.6)
➥ HttpServletResponse: HTTP-Antwort
➥ void setContentType(String type)
➥
setzt MIME-Typ der Antwort (i.d.R. "text/html")
➥ PrintWriter getWriter()
➥
liefert PrintWriter zum Schreiben der Ausgabe
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
320
6.1 Servlets ...
6.1.6 Sitzungs-Management
➥ Methode getSession() erlaubt Management von
Client-Sitzungen
➥ erzeugt neue Sitzung, falls noch keine existiert
➥ liefert Sitzungs-Objekt HttpSession als Ergebnis
➥ Verfolgung von Sitzungen:
➥ Server erzeugt eindeutige Sitzungs-ID
➥ Sitzungs-ID wird als Cookie im Client gespeichert
➥ Cookie wird bei jeder erneuten Anfrage an Server übertragen
➥ (Alternativ kann Sitzungs-ID auch an URLs angefügt werden)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
321
6.1.6 Sitzungs-Management ...
Das HttpSession-Objekt
➥ Identifiziert eindeutig eine Client-Sitzung
➥ Erlaubt, beliebige Information sitzungs-lokal zu speichern
➥ Wichtige Methoden:
➥ String getId(): liefert Sitzungs-ID
➥ boolean isNew(): neue Sitzung?
➥ void setAttribute(String name, Object value)
➥
Speichern sitzungslokaler Daten unter gegebenem Namen
➥ Object getAttribute(String name)
➥
Auslesen sitzungslokaler Daten mit gegebenem Namen
➥ setMaxInactiveInterval(int interval)
➥
Einstellen des Sitzungs-Timeouts
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
322
6.1.6 Sitzungs-Management ...
Beispiel: Hello-World mit sitzungslokalem Zähler
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
Integer counter;
HttpSession session = request.getSession();
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Hallo World</title></head>");
out.println("<body>");
if (session.isNew()) {
out.println("<b>Welcome to new session</b><br>");
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
323
6.1.6 Sitzungs-Management ...
Beispiel: Hello-World mit sitzungslokalem Zähler ...
counter = (Integer)session.getAttribute("HelloSession.cntr");
if (counter == null) {
counter = 1;
}
else {
counter++;
}
session.setAttribute("HelloSession.cntr", counter);
String name = request.getParameter("name");
out.println("<b>" + counter + ". Hello to " + name + "!</b>");
out.println("<br>Session ID: " + session.getId() + "</body>");
out.println("</html>");
out.close();
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
324
6 Servlets und JSP ...
6.2 Java Server Pages (JSP)
➥ Ziel: einfachere Generierung dynamischer HTML-Seiten
➥ Probleme von Servlets:
➥ Ausgabe von HTML-Code in println()-Anweisungen ist
umständlich / fehleranfällig
➥ der größte Anteil davon ist statisch
➥ Installation und Deployment von Servlets ist schwierig
➥ verglichen mit statischen HTML-Seiten
➥ Lösungsidee:
➥ Einbetten von Java-Servlet-Code in statische HTML-Seiten
➥ beim ersten Aufruf der Seite wird über JSP-Compiler automatisch ein Servlet erzeugt und in WWW-Server geladen
➥ spätere Aufrufe nutzen dann direkt das Servlet
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (11/15)
325
Client/Server-Programmierung
WS 2014/2015
12.12.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
xii
6.2 Java Server Pages (JSP) ...
6.2.1 Spezielle Tags für JSP
➥ Tag für Ausdrücke: <%= Ausdruck %>
➥ Wert des Java-Ausdrucks erscheint in HTML-Ausgabe
➥ Beispiel:
➥
➥
<html><body> 17 + 4 = <%= 17+4 %> </body></html>
Ergebnis: <html><body> 17 + 4 = 21 </body></html>
➥ Tag für Java-Code: <% Java-Code %>
➥ angegebener Java-Code wird in doGet() bzw. doPost()
Methode eines Servlets ausgeführt
➥ Ausgabe wird in HTML-Ausgabe eingefügt
➥ Java-Code kann auch mit regulärem HTML-Code gemischt
werden
➥ z.B. für bedingte HTML-Ausgaben
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
326
6.2.1 Spezielle Tags für JSP ...
➥ Tag für Java-Code: <% Java-Code %> ...
➥ Beispiel:
<html>
<body>
<%
java.util.Date date = new java.util.Date();
if (date.getHours() < 12) {
%>
Guten Morgen!
<% } else { %>
Guten Tag!
<% } %>
Es ist jetzt <%= date.toString() %>.
</body>
</html>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
327
6.2.1 Spezielle Tags für JSP ...
➥ Tag zur Deklaration globaler Variablen: <%! Deklaration %>
➥ globale Variable =
b Attribut der erzeugten Servlet-Klasse
➥ Wert bleibt über alle Aufrufe der JSP-Seite hinweg erhalten
➥
auch über verschiedene Client-Sitzungen hinweg
➥ Beispiel: Hit-Counter
<html>
<body>
<%! int hitCount = 0; %>
Hit Count: <%= ++hitCount %>
</body>
</html>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
328
6.2 Java Server Pages (JSP) ...
6.2.2 Vordefinierte Variablen
➥ Java-Code in JSP-Seiten kann u.a. folgende vordefinierte
Variablen nutzen:
➥ request
➥
HttpServletRequest-Parameter der Servlet-Methoden
doGet() bzw. doPost()
➥ response
➥
HttpServletResponse-Parameter
➥ out ( ≈ response.getWriter() )
➥
JSPWriter (≈ PrintWriter) für HTML-Ausgabe
➥ session ( = request.getSession() )
➥
HttpSession-Objekt für aktuelle Client-Sitzung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
329
6.2 Java Server Pages (JSP) ...
6.2.3 Beispiele
➥ Hello-World (funktional identisch mit Beispiel aus 6.1.3)
<html>
<body>
<%! int counter = 0; %>
<%
counter++;
String name = request.getParameter("name");
%>
<b><%= counter%>. Hello to <%= name%>!</b>
</body>
</html>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
330
6.2.3 Beispiele ...
➥ Hello-World mit sitzungslokalem Zähler
(funktional identisch mit Servlet-Beispiel aus 6.1.6)
<html>
<body>
<%
Integer counter;
if (session.isNew()) {
out.println("<b>Welcome to new session</b><br>");
}
counter = (Integer)
session.getAttribute("HelloSession.cntr");
if (counter == null) {
counter = 1;
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
331
6.2.3 Beispiele ...
else {
counter++;
}
session.setAttribute("HelloSession.cntr", counter);
String name = request.getParameter("name");
out.println("<b>" + counter + ". Hello to "
+ name + "</b>");
out.println("<br>Session ID: " + session.getId());
%>
</body>
</html>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
332
6.2 Java Server Pages (JSP) ...
6.2.4 JSP Direktiven
➥ JSP bietet einige Direktiven, die das Verhalten der JSP-Seite
kontrollieren
➥ Allgemeine Syntax: <%@ Direktive %>
➥ Wichtige Beispiele:
➥ <%@ include file="copyright.html" %>
➥
Einfügen der Datei copyright.html in die JSP-Seite
➥ <%@ page import="javax.rmi.*, javax.naming.*" %>
➥
Importieren von Java-Paketen (komma-separierte Liste)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
333
6.2 Java Server Pages (JSP) ...
6.2.5 JSP und Java Beans
➥ JSP-Seiten können auch auf Java Beans zurückgreifen:
➥ <jsp:useBean id="product"
class="com.company.ProductBean"/>
➥ Erzeugt eine Bean-Instanz für alle Aufrufe der JSP-Seite
➥ Referenz in der globalen Variable product gespeichert
➥ Abfrage von Properties der Bean:
➥ <jsp:getProperty name="product" property="Price"/>
➥ entspricht <%= product.getPrice() %>
➥ Setzen von Properties der Bean:
➥ <jsp:setProperty name="product" property="Price"
value="12.50"/>
➥ Vorteil: Modularität, weniger / kein Java-Code in der JSP-Seite
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
334
6 Servlets und JSP ...
6.3 Zusammenfassung
➥ Servlets: Java-Klassen zur Bearbeitung von HTML-Anfragen in
WWW-Servern
➥ Erzeugung dynamischer HTML-Seiten
➥ Klassen: HttpServlet, HttpServletRequest,
HttpServletResponse
➥ Im Server: genau eine Instanz der Servlet-Klasse
➥ Sitzungs-Management kann/muß explizit programmiert
werden (HttpSession)
➥ JSP: Vereinfachter Umgang mit Servlets
➥ Mischung von statischem HTML-Code und Servlet-Code
➥ Servlet wird dynamisch aus JSP-Seite genieriert
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
335
Client/Server-Programmierung
WS 2014/2015
7
Web Services
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
336
7 Web Services ...
Inhalt
➥ Einführung
➥ Web-Service-Standards
➥ XML, SOAP, WSDL, UDDI
➥ Web Services mit Axis2
➥ Sicherheit von Web Services
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
337
7 Web Services ...
Literatur
➥ Hammerschall, Kap. 7
➥ Langner: Web Services mit Java
➥ Hein, Zeller: Java Web Services
➥ A. Eberhart, S. Fischer: Web Services, Hanser, 2003.
➥ M. P. Papagoglou: Web Servces: Principles and Technology,
Pearson, 2008.
➥ T. Frotscher, M. Teufel, D. Wang: Java Web Services mit Apache
Axis2, Entwickler.press, 2007
➥ Zu XML auch: Horstmann / Cornell, Kap. 12
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
338
7 Web Services ...
7.1 Einführung
➥ Im Web heute: Mensch-Maschine-Kommunikation
➥ statische und dynamische Web-Seiten (Servlets, JSP, ...)
➥ Ziel von Web-Services: Maschine-Maschine-Kommunikation
➥ Vision: Web-Services bieten komplexe Dienste an, suchen
dazu eigenständig nach Teildiensten im Netz
Hotel−
Service
Internet
Client−
Anwendung
Web Service
Reise−
Service
Internet
Flugbuchungs−
Service
Web Service
Web Service
Autobuchungs−
Service
Web Service
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
339
7.1 Einführung ...
➥ Ziel von Web Services:
➥ plattform- und sprachunabhängige Nutzung von Diensten auf
entfernten Rechnern
➥ Modell ist dienst-orientiert, nicht objekt-orientiert
➥ Web Services definieren kein verteiltes Objektmodell
➥ Dienste sind als zustandslos angenommen
➥
aber: Erweiterungen für Sitzungsbehandlung möglich
➥ Web Services kommunizieren durch den Austausch von XMLDokumenten
➥ I.a. synchrone Kommunikation mit Anfrage/Antwort-Muster
➥ aber auch allgemeinere Kommunikationsmuster möglich
➥
Anfragen ohne Antwort, Ereignismeldungen, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
340
7.1 Einführung ...
➥ Web Services sind zunächst nur über zwei Standards definiert:
➥ das Kommunikationsprotokoll (SOAP)
➥ die Schnittstellenbeschreibung (WSDL)
➥ Diese reichen aus, um Interoperabilität zu gewährleisten
➥ vgl. IIOP und OMG-IDL bei CORBA
➥ Web Service Frameworks (z.B. Axis2) bieten darüberhinaus
(proprietäre) Werkzeuge und APIs für z.B.
➥ die Erzeugung von Client- und Server-Stubs
➥ die Erzeugung / Manipulation von SOAP-Nachrichten
➥ das Deployment von Web Services
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
341
7 Web Services ...
7.2 Web-Service-Standards
➥ Grundelemente zur Realisierung von Web Services:
➥ SOAP (ursprünglich Simple Object Access Protocol)
➥
➥
zum Nachrichtenaustausch
legt i.w. Codierung von Datenstrukturen fest
➥ WSDL (Web Service Description Language)
➥
Dienst- und Schnittstellenbeschreibung
➥ enthält u.a. auch Ort“ des Dienstes (Host / Port)
”
➥ UDDI (Universal Description and Discovery Interface)
➥ zur Registrierung und zum Auffinden von Diensteanbietern
und Diensten
➥ Alle drei Elemente basieren auf XML
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
342
7.2 Web-Service-Standards ...
7.2.1 XML (Extensible Markup Language)
➥ Deskriptive Sprache zur Beschreibung komplexer Datenstrukturen in einem Dokument
➥ vorwiegend zum Datenaustausch zwischen Systemen
➥ d.h. XML liefert ein vereinheitlichtes Datenfomat
➥ Technisch:
➥ XML-Dokument ist ein Textdokument mit Tags, die Nutzinfor-
mation umschließen (Elemente)
➥ Elemente können verschachtelt werden
➥
hierarchische Dokumenten-Struktur (mit Verweisen)
➥ Syntax ähnlich wie bei HTML, jedoch strikter
➥
aber: bei XML legen Tags die Bedeutung der Information
fest, bei HTML die Formatierung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
343
7.2.1 XML (Extensible Markup Language) ...
Aufbau eines XML-Dokuments
➥ Ein XML-Dokument besteht aus zwei Teilen:
➥ Kopf (Header ): XML Version, Zeichensatz, ggf. Angabe des
Dokumententyps (DTD bzw. XML-Schema, s. Folie 348ff)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE addressbook SYSTEM ¨addressbook.dtd¨>
➥ Rumpf (Body ): verschachtelte Folge von Elementen
<addressbook>
<mail-address category="professor">
<name>Roland Wismüller</name>
.d
wismuellera
@d
uni-siegena
.de</email>
<email>rolanda
</mail-address>
</addressbook>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
344
7.2.1 XML (Extensible Markup Language) ...
Wohlgeformte XML-Dokumente
➥ Ein XML-Dokument ist wohlgeformt, wenn es die syntaktischen
Regeln von XML einhält, u.a.:
➥ Struktur eines Elements: <name> ... </name>
➥
Ende-Tag muß immer vorhanden sein
➥ Abkürzung für leere Elemente: <leeresElement/>
➥ korrekte Verschachtelung der Elemente in Baumstruktur
➥
nicht: <name>...<email> </name>...</email>
➥ XML-Dokument muß genau ein Wurzelelement besitzen
➥ öffnende (und leere) Tags können auch Attribute besitzen
➥
z.B. <person name="Heinz" age="9">... </person>
➥ Kommentare: <!-- ein Kommentar -->
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
345
7.2.1 XML (Extensible Markup Language) ...
Gültige XML-Dokumente
➥ Nicht jedes wohlgeformte XML-Dokument beschreibt eine gültige
Datenstruktur
➥ der Datentyp muß ebenfalls berücksichtigt werden
➥ z.B. im Beispiel von Folie 344: ein Adreßbucheintrag muß aus
Name und Email-Adresse bestehen
➥ Dazu: XML erlaubt die Definition eines Dokumententyps bzw.
Schemas
➥ legt Namen, Verschachtelung, Abfolge, und möglichen Inhalt
der Elemente fest
➥ DTD (Document Type Definition): alte Methode
➥ XML Schema: aktuelle Methode
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
346
7.2.1 XML (Extensible Markup Language) ...
Namensräume in XML
➥ Um Tag-Namen aus verschiedenen DTDs bzw. Schematas
unterscheiden zu können, führt XML Namensräume ein
➥ Namensraum wird durch URI (meist: URL) identifiziert
➥ URI garantiert weltweite Eindeutigkeit
➥ Beispiel:
<bsp:myElem xmlns:bsp="http://www.uni-siegen.de/bsp">
<bsp:mySubElem>Hallo</bsp:mySubElem>
</bsp:myElem>
➥ der String bsp ist ein Alias für den Namensraum
➥
wird allen Elementen des Namensraums vorangestellt
➥ Ein Dokument kann auch mehrere Namensräume nutzen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
347
7.2.1 XML (Extensible Markup Language) ...
XML Schema
➥ Ein XML Schema ist ein XML-Dokument, das den Aufbau von
XML-Dokumenten beschreibt
➥ Prinzip: zulässige Struktur und Inhalt eines XML-Dokuments wird
als Datentyp beschrieben
➥ Bausteine:
➥ vordefinierte, einfache Datentypen
➥ ggf. mit Einschränkung von Wertebereich bzw. Syntax
➥ selbst definierte, einfache Datentypen (z.B. Aufzählung)
➥ komplexe (zusammengesetzte) Datentypen
➥ Sequenzen (feste Folge von Unterelementen)
➥ Alternativtypen (alternativ wählbare Unterelemente)
➥ Kardinalitäts-Angabe (wie oft muß/darf Element auftreten?)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
348
7.2.1 XML (Extensible Markup Language) ...
Beispiel: XML Schema für das Adressbuch
Root−Element
Namensraum
AddressBookType be−
steht aus 0 oder mehr
<mail−address> Elementen
"1.0" encoding="UTF−8"
"UTF−8" ?>
<? xml version
version="1.0"
<xsd:schema
xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
"http://www.w3.org/2001/XMLSchema"
<xsd:element
xsd:element name="addressbook"
"addressbook" type="AddressBookType"/>
"AddressBookType"
xsd:complexType name="AddressBookType">
"AddressBookType"
<xsd:complexType
<xsd:element
xsd:element name="mail−address"
"mail−address"
minOccurs="0"
"0" maxOccurs="unbounded">
"unbounded"
xsd:complexType name="MailAddressType">
<xsd:complexType
"MailAddressType"
xsd:sequence
<xsd:sequence>
<xsd:element
xsd:element name="name"
"name" type="xsd:string"/>
"xsd:string"
<xsd:element
xsd:element name="email"
"email" type="xsd:string"
"xsd:string"
maxOccurs="unbounded"/>
"unbounded"
</xsd:sequence>
xsd:sequence
<mail−address> enthält erst ein <name> Element
und dann ein oder mehr <email> Elemente
Roland Wismüller
Betriebssysteme / verteilte Systeme
Die Elemente <name>
und <email> enthalten Text
Client/Server-Programmierung (12/15)
349
7.2.1 XML (Extensible Markup Language) ...
Beispiel: XML Schema für das Adressbuch ...
<mail−address> kann
ein Attribut vom Typ
CategoryType haben
<xsd:attribute
"category" type="CategoryType"
"CategoryType"
xsd:attribute name="category"
use="optional"/>
"optional"
</xsd:complexType>
xsd:complexType
</xsd:element>
xsd:element
</xsd:complexType>
xsd:complexType
<xsd:simpleType
"CategoryType" base="xsd:string">
"xsd:string"
xsd:simpleType name="CategoryType"
<xsd:enumeration
"professor"
xsd:enumeration value="professor"/>
<xsd:enumeration
"assistant"
xsd:enumeration value="assistant"/>
</xsd:simpleType>
xsd:simpleType
CategoryType ist ein
</xsd:schema>
String, der nur die Werte
xsd:schema
"professor" oder "assistant"
haben kann
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
350
7.2.1 XML (Extensible Markup Language) ...
Beispiele für XML-Dokumente (nur Rumpf)
Gültig:
Ungültig:
<addressbook>
<addressbook>
<mail−address>
<mail−address>
<email>[email protected]</email>
<name>Hugo</name>
<email>[email protected]</email>
<name>Hugo</name>
</mail−address>
</mail−address>
<mail−address
<mail−address
category="assistant">
category="assistant">
<name>Fritz</name>
<name>Fritz</name>
<email>fr@home</email>
</mail−address>
<email>Hallo</email>
<name>Hans</name>
</mail−address>
</addressbook>
</addressbook>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
351
7.2.1 XML (Extensible Markup Language) ...
XML Parser
➥ Für XML existieren generische Parser, die zusätzlich auch die
Gültigkeit des Dokuments prüfen können
➥ Vorteil von XML gegenüber anderen Beschreibungssprachen
➥ Es gibt zwei Parsertypen:
➥ SAX-Parser erzeugen für jedes auftretende XML-Primitiv ein
Ereignis
➥
Anwendung muß zugehörige Handler definieren
➥ DOM-Parser setzen Dokument komplett in Datenstruktur um
➥
➥
➥
DOM: Document Object Model
vorteilhaft, wenn Dokument manipuliert werden soll
nachteilig bei großen Dokumenten (Speicherbedarf)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
352
7.2 Web-Service-Standards ...
7.2.2 SOAP
➥ XML-basiertes Protokoll zum Austausch strukturierter Daten
➥ Unabhängig vom darunterliegenden Transportprotokoll
➥ Bindungen für HTTP, SMTP, FTP, etc. möglich
➥ SOAP ist ein allgemeines Nachrichtenprotokoll
➥ SOAP 1.2 definiert mehrere Nachrichtenaustausch-Muster, u.a.:
➥ dialogorientierter (freier) Nachrichtenaustausch
➥ Anfrage/Antwort-Muster (für RPC)
➥ SOAP definiert i.W. ein Nachrichtenformat
➥ SOAP ist erweiterbar
➥ z.B. für Sicherheit (Verschlüsselung etc.)
➥ Aktuelle Version: 1.2 (April 2007)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
353
7.2.2 SOAP ...
Das SOAP-Nachrichtenformat
<?xml version="1.0" ?>
SOAP Envelope
<env:Envelope
xmlns:env="http://www.w3.org/2003/05/soap−envelope">
<env:Header>
SOAP Header
Header Block (anwendungsspezifisch)
Header Block (anwendungsspezifisch)
</env:Header>
<env:Body>
SOAP Body
Nachrichten−Rumpf (anwendungsspezifisch)
</env:Body>
</env:Envelope>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
354
7.2.2 SOAP ...
Das SOAP-Nachrichtenformat ...
➥ SOAP legt i.W. nur Struktur der Nachrichten fest
➥ Inhalt von Header und Body sind anwendungsspezifisch
➥
d.h. Schema läßt beliebige Elemente zu
➥ Header ist optional, enthält Metadaten
➥
z.B. Transaktionsnummern, Authentifizierungsdaten
➥ Body muß vorhanden sein, enthält Anwendungsdaten
➥ Elemente des Envelope liegen in eigenem Namensraum
➥ typisch: eigene Namensräume für Header -Blöcke und Body
➥ Hinzufügen weiterer Elemente im Envelope möglich
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
355
7.2.2 SOAP ...
Der SOAP-Header
➥ Enthält Anweisungen, die festlegen, wie ein SOAP-Knoten die
Nachricht verarbeiten soll
➥ SOAP-Knoten: Sender, Empfänger und Zwischenknoten (z.B.
Weiterleitung, Signierung, ...)
➥ Beispiele:
➥ Sicherheits-Header
➥
Zertifikat und Signatur für einige Body -Elemente
➥ anwendungsspezifische Metadaten
➥
z.B. Kundendaten des Clients
➥ Die Elemente des Headers werden von SOAP nicht festgelegt,
es gibt aber vorgeschriebene Attribute der Header -Elemente
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
356
7.2.2 SOAP ...
Der SOAP-Header ...
➥ Attribute von SOAP Header -Elementen:
➥ role: für wen ist der Header gedacht?
➥
➥
Kodierung der Rollen durch URI (wg. Eindeutigkeit)
einige vordefinierte URIs, u.a. für beliebige Empfangsknoten und endgültigen Empfänger
➥ mustUnderstand: der Knoten, für den der Header -Block
gedacht ist, muß ihn verstehen oder eine Fehlernachricht
zurückgeben
➥ relay: soll der Header -Block weitergereicht werden, falls er
nicht verarbeitet wurde?
➥ verarbeitete Header -Blöcke werden nie weitergereicht
(können aber erneut eingefügt werden)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
357
7.2.2 SOAP ...
Der SOAP Body
➥ Aufbau ist abhängig von Kommunikationsstil und Codierungsstil
➥ Kommunikationsstil (communication style / binding style):
➥ RPC: SOAP-Nachrichten speziell für RPCs
➥
➥
Prozeduraufruf mit Parametern bzw. Rückgabewerte
Aufbau des Body ist i.w. durch SOAP festgelegt
➥ document: SOAP-Nachrichten für allgemeine Dokumente
➥
➥
➥
für nachrichtenorientierte Kommunkation, wird aber auch
für RPCs verwendet
Body kann beliebige XML-Daten enthalten
Aufbau des Body ist nur durch XML-Schema im WSDLDokument festgelegt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
358
7.2.2 SOAP ...
Der SOAP Body ...
➥ Codierungsstil (encoding style / use):
➥ encoded:
➥
➥
SOAP-spezifische Typen
Werte in der SOAP-Nachricht haben explizite Typangabe
➥ literal:
➥
➥
Datentypen werden durch XML-Schema beschrieben
bei RPC-Stil nur Parameter, bei document gesamter Body
➥ Definition eigener Datentypen mit XML-Schema möglich
➥
z.B. auch zusammengesetzte Datenstrukturen
➥ Relevante Kombinationen: RPC/encoded und document/literal
➥ encoded nicht konform zu WS-I (Web Services-Interoperability )
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
359
7.2.2 SOAP ...
Aufbau des SOAP Body beim RPC Stil
➥ Body enthält immer nur genau ein Element
➥ Bei Anfragenachricht:
➥ Name = Name der aufzurufenden Operation
➥ Kindelemente: Parameter der Operation (mit Namen)
➥ Bei Antwortnachricht:
➥ Name ist frei wählbar (meist: Operationsname + Response)
➥ Kindelemente:
➥
➥
Rückgabewert (meist result), falls Ergebnistyp 6= void
Ausgabeparameter der Operation (mit Namen)
➥ zum Melden von Fehlern: spezielles <fault>-Element
➥
Unterelemente für Fehlercode und -beschreibung
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
360
7.2.2 SOAP ...
Beispiel einer SOAP-Nachricht (RPC/encoded)
➥ Request-Nachricht für einen Aufruf der Java-Methode
String reserviere(String flugNr, int sitze, Date datum);
<?xml version=’1.0’ encoding=’UTF-8’?>
<env:Envelope
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Body>
<ns1:reserviere
env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding
xmlns:ns1="http://www.web-air.de/axis/Buchung.jws">
<flugNr xsi:type="xsd:string">WA417</flugNr>
<sitze xsi:type="xsd:int">3</sitze>
<datum xsi:type="xsd:dateTime">2003-07-11</datum>
</ns1:reserviere>
</env:Body>
</env:Envelope>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
361
7.2.2 SOAP ...
Aufbau des SOAP Body beim document Stil
➥ Nach WS-I sollte Body nur ein Element enthalten
➥ ggf. Einwickeln“ der Argumente in ein neues Element
”
(wrapped Konvention)
➥ Problem bei RPCs: Name der Operation geht aus SOAP-Nachricht nicht zwangsläufig hervor
➥ Mögliche Abhilfen:
➥ bei document/wrapped : Elementname = Operationsname
➥ Spezifikation über das Transportprotokoll
➥
z.B. im HTTP-Header: SOAPAction (SOAP 1.1) bzw.
action Attribut von Content-Type (SOAP 1.2)
➥ WS-Addressing: Spezifikation im SOAP Header
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (12/15)
362
Client/Server-Programmierung
WS 2014/2015
09.01.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
xiii
7.2.2 SOAP ...
Beispiel einer SOAP-Nachricht (document/literal/wrapped)
➥ Request-Nachricht für einen Aufruf der Java-Methode
String reserviere(String flugNr, int size, Date datum);
<?xml version=’1.0’ encoding=’UTF-8’?>
<soapenv:Envelope
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<reserviere xmlns="http://ws.apache.org/axis2">
<flugNr>WA417</flugNr>
<sitze>3</sitze>
<datum>2003-07-11</datum>
</reserviere>
</soapenv:Body>
</soapenv:Envelope>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
363
7.2.2 SOAP ...
Beispiel einer SOAP-Nachricht (document/literal/wrapped) ...
➥ Antwortnachricht
<?xml version=’1.0’ encoding=’UTF-8’?>
<soapenv:Envelope
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<reserviereResponse xmlns="http://ws.apache.org/axis2">
<return>GHFTR89</return>
</reserviereResponse>
</soapenv:Body>
</soapenv:Envelope>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
364
7.2.2 SOAP ...
Die SOAP-HTTP-Bindung
➥ SOAP-Standard definiert zwei Methoden:
➥ Verwendung von HTTP POST:
➥
➥
SOAP-Anfrage-Nachricht wird im Rumpf der HTTP-Anfrage
an den Server gesendet
Antwort als SOAP-Nachricht in der HTTP-Antwort
➥ Verwendung von HTTP GET:
➥
➥
Operation und Parameter werden in URL der HTTP-Anfrage
codiert (ohne SOAP)
Antwort als SOAP-Nachricht in der HTTP-Antwort
➥ Empfehlung des Standards:
➥ GET-Methode (nur) verwenden bei Aufrufen ohne Seiteneffek-
te und ohne SOAP-Header
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
365
7.2 Web-Service-Standards ...
7.2.3 WSDL
➥ XML-basierte Sprache zur Beschreibung von Diensten
➥ also u.a. Schnittstellen-Beschreibungssprache
➥ zusätzlich aber auch: Ort (URL) des Dienstes und zu verwen-
dendes Protokoll
➥ Eigenschaften von WSDL
➥ unabhängig von Programmiermodell, Implementierungsspra-
chen und Transportprotokoll
➥ WSDL ist auch unabhängig von SOAP
➥ Unterstützung von XML Schema zur Definition von Typen
➥ WSDL ist selbst über XML Schema definiert
➥ Aktuelle Version: 2.0 (Juni 2007), verwendet häufig noch 1.1
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
366
7.2.3 WSDL ...
Aufbau eines WSDL-Dokuments
<?xml version="1.0" ?>
Wurzelelement
<wsdl:definitions
targetNamespace="http://www.web−air.de/Buchung/"
...
xmlns:wsdl="http://www.w3.org/2003/06/wsdl">
Spezifikation von Datentypen
Beschreibung der Nachrichtenformate (WSDL 1.1)
Beschreibung der Schnittstellen
Beschreibung der Bindungen
Beschreibung des Dienstes
</wsdl:definitions>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
367
7.2.3 WSDL ...
Zur Struktur eines WSDL-Dokuments
➥ Ein WSDL-Dokument beschreibt Dienste
➥ Ein Dienst wird über ein oder mehrere Endpunkte erreicht
➥ Ein Endpunkt beschreibt den Ort (URI) des Dienstes und ist mit
genau einer Bindung assoziiert
➥ Eine Bindung bindet die Operationen einer Schnittstelle an ein
bestimmtes Protokoll
➥ Eine Schnittstelle beschreibt mehrere Operationen
➥ Für jede Operation werden die Nachrichtenformate für Ein- und
Ausgabeparameter festgelegt (WSDL 1.1)
➥ Ein Nachrichtenformat besteht aus einer Sequenz von Feldern
mit gegebenen Datentypen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
368
7.2.3 WSDL ...
Beispiel zur allgemeinen Struktur eines Dienstes
Dienst
Endpunkt
mit URI 1
(SOAP)
Endpunkt
Endpunkt
mit URI 2
mit URI 3
(HTTP GET) (HTTP POST)
Schnittstelle 1
Operation 1
Operation 2
Operation 3
Roland Wismüller
Betriebssysteme / verteilte Systeme
Endpunkt
mit URI 4
(SOAP)
Endpunkt
mit URI 5
(HTTP GET)
Schnittstelle 2
Operation 4
Operation 5
Client/Server-Programmierung (13/15)
369
7.2.3 WSDL ...
Spezifikation von Datentypen
➥ Element <types>
➥ Erlaubt Definition eigener komplexer Datentypen
➥ Nutzung von XML Schema
➥ Beispiel: Datentyp für Parameter einer Flugreservierung
<wsdl:types>
<xs:schema targetNamespace="http://www.web-air.de/Buchung/">
<xs:element name="reservierung">
<xs:complexType>
<xs:sequence>
<xs:element name="flugNr" type="xs:string"/>
<xs:element name="sitze" type="xs:int"/>
<xs:element name="date" type="xs:date"/>
...
</wsdl:types>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
370
7.2.3 WSDL ...
Beschreibung der Nachrichtenformate (WSDL 1.1)
➥ Element <message>
➥ Für jede vom Dienst verwendete Nachricht (Anfrage, Antwort, ...)
wird das Format definiert:
➥ eine Nachricht besteht aus beliebig vielen Teilen mit festgelegtem Datentyp
➥ Standard XML-Datentyp oder in <types> definiert
➥ üblich: nur ein Teil mit einem complexType als Typ
➥ Beispiel (ohne Namensraumangabe für WSDL-Elemente):
<message name="reserviereRequest">
<part name="parameters" type="ns:reservierung"/>
</message>
<message name="reserviereResponse">
<part name="parameters" type="ns:reserviereResponse"/>
</message>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
371
7.2.3 WSDL ...
Beschreibung der Schnittstellen
➥ Element <portType> (WSDL 2.0: <interface>)
➥ Beschreibt beliebig viele Operationen mit
➥ ihren Eingabe-, Ausgabe- und ggf. Fehlernachrichtentypen
➥ ihrem Interaktionsmuster
➥
➥
z.B. nur Eingabenachricht, Request/Response, ...
definiert durch Reihenfolge der Nachrichtenspezifikationen
➥ Beispiel (ohne Namensraumangabe für WSDL-Elemente):
<portType name="BuchungPortType">
<operation name="reserviere">
<input message="ns:reserviereRequest" />
<output message="ns:reserviereResponse" />
</operation>
</portType>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
372
7.2.3 WSDL ...
Beschreibung der Bindungen
➥ Element <binding>
➥ Zu jeder Schnittstelle kann es eine oder mehrere Bindungen
geben
➥ Die Bindung legt fest
➥ das Transportprotokoll (z.B. SOAP, HTTP PUT, HTTP GET)
➥ den Kommunikationsstil (rpc oder document)
➥ für jede Operation:
➥
➥
URI für den Aufruf der Operation
➥ wird bei HTTP in das SOAPAction-Element bzw. actionAttribut im HTTP-Header übernommen
➥ wichtig bei document, vgl. Folie 362
Codierung der Ein- und Ausgabe (encoded oder literal)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
373
7.2.3 WSDL ...
Beschreibung der Bindungen ...
➥ Beispiel (ohne Namensraumangabe für WSDL-Elemente):
<binding name="BuchungSoapBinding" type="ns:BuchungPortType">
<soap:binding transport=
"http://schemas.xmlsoap.org/soap/http" style="document" />
<operation name="reserviere">
<soap:operation soapAction="urn:reserviere" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
374
7.2.3 WSDL ...
Beschreibung des Dienstes
➥ Beschreibung besteht aus Liste von Endpunkten
➥ Element <port> (WSDL 2.0: <endpoint>)
➥ jeweils mit Ortsangabe (URI) und zugehöriger Bindung
➥ Beispiel (ohne Namensraumangabe für WSDL-Elemente):
<service name="Buchung">
<port name="BuchungHttpSoapEndpoint"
binding="s0:BuchungSoapBinding">
<soap:address
location="http://www.web-air.de/Buchung/Buchung.asmx" />
</port>
</service>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
375
7.2.3 WSDL ...
Vollständiges Beispiel eines WSDL-Dokuments (WSDL 1.1)
➥ Dienst mit zwei Operation (als Java-Interface beschrieben):
public interface Test {
public String getIt();
public void putIt(String it);
}
➥ WSDL-Dokument für den entsprechenden Web-Service:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:axis2="http://ws.apache.org/axis2"
xmlns:ns="http://ws.apache.org/axis2/xsd"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
targetNamespace="http://ws.apache.org/axis2">
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
376
7.2.3 WSDL ...
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://ws.apache.org/axis2/xsd">
<xs:element name="getItResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="return" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="putIt">
<xs:complexType>
<xs:sequence>
<xs:element name="param0" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
377
7.2.3 WSDL ...
<wsdl:message name="getItMessage" />
<wsdl:message name="getItResponseMessage">
<wsdl:part name="part1" element="ns:getItResponse" />
</wsdl:message>
<wsdl:message name="putItMessage">
<wsdl:part name="part1" element="ns:putIt" />
</wsdl:message>
<wsdl:portType name="TestPortType">
<wsdl:operation name="getIt">
<wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl
wsaw:Action="urn:getIt" message="axis2:getItMessage"/>
<wsdl:output xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl
message="axis2:getItResponseMessage" wsaw:Action="urn:getIt"/>
</wsdl:operation>
<wsdl:operation name="putIt">
<wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl
wsaw:Action="urn:putIt" message="axis2:putItMessage"/>
</wsdl:operation>
</wsdl:portType>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
378
7.2.3 WSDL ...
<wsdl:binding name="TestSOAP11Binding" type="axis2:TestPortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<wsdl:operation name="getIt">
<soap:operation soapAction="urn:getIt" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="putIt">
<soap:operation soapAction="urn:putIt" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
</wsdl:operation>
</wsdl:binding>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
379
7.2.3 WSDL ...
<wsdl:binding name="TestSOAP12Binding" type="axis2:TestPortType">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
...
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="Test">
<wsdl:port name="TestSOAP11port"
binding="axis2:TestSOAP11Binding">
<soap:address
location="http://localhost:8080/axis2/services/Test" />
</wsdl:port>
<wsdl:port name="TestSOAP12port"
binding="axis2:TestSOAP12Binding">
<soap12:address
location="http://localhost:8080/axis2/services/Test" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
380
7.2 Web-Service-Standards ...
7.2.4 Nutzung von SOAP und WSDL
➥ Programmierer von Web Services hat i.a. nicht direkt mit SOAP
und WSDL zu tun
➥ Web Service Frameworks enthalten Werkzeuge, die
➥ Stubs und Skeletons zum Erzeugen und Interpretieren von
SOAP-Nachrichten generieren
➥ WSDL-Beschreibungen aus z.B. Java Interfaces erzeugen
(und umgekehrt)
➥ Aber: Grundkenntnisse nützlich für
➥ Verständnis von Web Services
➥ Fehlersuche / Nutzung der Frameworks
➥ spezielle Funktionen wie z.B. Sicherheit
➥
benötigen Manipulation der SOAP-Nachrichten
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
381
7.2.4 Nutzung von SOAP und WSDL ...
Werkzeuge und Java-APIs für SOAP und WSDL
➥ Java-APIs
➥ JAXM: Erstellung, Verarbeitung und Versand von SOAP-
Nachrichten
➥ javax.xml.soap.*, javax.xml.messaging.*
➥ JAX-RPC: API und Werkzeuge für RPCs über SOAP
➥
➥
javax.rpc.*
u.a. auch Erstellung von WSDL und Stubs/Skeletons
➥ Frameworks für Web-Services
➥ in der Vorlesung: EJB 3 (☞ 7.3) und Axis2 (☞ 7.4)
➥ weitere z.B. IBM Web-Sphere, Microsoft Visual Studio .NET,
BEA WebLogic, Borland JBuilder, ...
➥ integrierte Programmentwicklungs-Umgebungen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
382
7 Web Services ...
7.3 Web-Services und EJB
➥ Eine stateless Session Bean kann durch einfache Annotation zu
einem Web-Service gemacht werden:
@Stateless
@WebService
public class HelloImpl implements HelloRemote {
@WebMethod
public String sayHello() {
return "Hallo? Jemand da?";
}
}
➥ WSDL-Datei bei OpenEJB dann unter folgender URL verfügbar:
➥ http://<host> :<httpejbd-port> /HelloImpl?WSDL
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
383
7 Web Services ...
7.4 Web Services mit Axis2
➥ Axis2: Framework für Entwicklung und Deployment Java-basierter
Web Services
➥ Bestandteile von Axis2
➥ Web Service-Container
➥ Java API
➥ Werkzeuge für WSDL-Unterstützung und Deployment
➥ Funktionsumfang von Axis2
➥ Unterstützung von SOAP 1.1/1.2, WSDL 1.1/2.0
➥ Flexibles Deployment (Hot Deployment / Hot Update)
➥ WSDL-Unterstützung (Übersetzung WSDL ↔ Java)
➥ Fehlerbehandlung (Java Exception → <fault>-Nachricht)
➥ Erweiterbarkeit durch Plug-In Module
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
384
7.4 Web Services mit Axis2 ...
7.4.1 Technisches zu Axis2
➥ Der Web-Service-Container von Axis2 ist als Servlet realisiert
➥ meist in Verbindung mit dem Tomcat-Server
➥ Im Folgenden wird Kombination Axis2/Tomcat vorausgesetzt
➥ entspricht Installation im Labor H-A 4111
➥ Verzeichnisstruktur von Axis2 (wichtig für das Deployment)
$CATALINA_BASE
Wurzelverzeichnis von tomcat
webapps
ROOT
axis2
WEB−INF
services Zielverzeichnis für Deployment
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
385
7.4.1 Technisches zu Axis2 ...
Start des Axis2 Web-Service-Containers
➥ Wenn Axis2 korrekt installiert ist, muß nur der Tomcat-Server
gestartet werden:
➥ $CATALINA_HOME/bin/catalina.sh run
➥ Wenn Hot Update in Axis2 nicht aktiviert ist, muß Tomcat bei
einer Änderung deployter Web Services neu gestartet werden!
➥
alternativ: Reload von Axis2 im Tomcat-Manager
➥ Funktionstest:
➥ Aufruf der Axis2-Startseite im Browser
➥
➥
URL: http://localhost:8080/axis2/
enthält u.a. Links zu Validierungsseite und Liste deployter
Web Services
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
386
7.4 Web Services mit Axis2 ...
7.4.2 Beispiel: Hello-World mit Axis2
➥ Schritte zur Erstellung der WSDL-Beschreibung
1. Erstellung der Java-Schnittstelle HelloWorld.java
2. Übersetzen der Schnittstelle:
javac HelloWorld.java
3. Erzeugung einer WSDL-Datei aus dieser Schnittstelle:
java2wsdl.sh
-l http://localhost:8080/axis2/services/HelloWorld
-cn HelloWorld
➥ Schritte zur Erstellung des Web Services
1. Erzeugung von Implementierungsrahmen, Hilfsklassen,
Service-Deskriptor und Build-Skript aus der WSDL-Datei:
wsdl2java.sh -d adb -uw -ss -p hello -sd
-uri HelloWorld.wsdl
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
387
7.4.2 Beispiel: Hello-World mit Axis2 ...
➥ Schritte zur Erstellung des Web Services ...
2. Editieren von src/hello/HelloWorldSkeleton.java
➥
Implementieren der Operationen (Methoden)
3. ggf. Anpassen des Service-Deskriptors (☞ S. 400)
4. Übersetzen und Packen des Services:
ant jar.server
5. Kopieren des Archivs in das Axis2-Verzeichnis:
cp build/lib/HelloWorld.aar
$CATALINA_BASE/webapps/axis2/WEB-INF/services/
➥ Erster Test kann über folgende URL erfolgen:
➥ http://localhost:8080/axis2/services/HelloWorld/
sayHello?args0=Roland
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
388
7.4.2 Beispiel: Hello-World mit Axis2 ...
➥ Schritte zur Erstellung des Clients
1. Erstellung einer Java-Schnittstelle für den aufzurufenden Web
Service:
wsdl2java.sh -uri
http://localhost:8080/axis2/services/HelloWorld?wsdl
-d adb -uw -p hello
2. Erstellung des Client-Programms
src/hello/HelloClient.java
3. Übersetzung und Packen des Client-Programms:
ant jar.client
4. Start des Client-Programms:
axis2.sh -cp build/lib/HelloWorld-test-client.jar
HelloClient
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
389
7.4.2 Beispiel: Hello-World mit Axis2 ...
➥ Die Schnittstelle HelloWorld.java:
public interface HelloWorld {
public String sayHello (String name);
}
➥ Der von Hand ergänzte Implementierungsrahmen
src/hello/HelloWorldSkeleton.java:
package hello;
public class HelloWorldSkeleton {
int cnt = 0;
public java.lang.String sayHello(java.lang.String args0)
{
return "Hello to " + args0 + " (" + ++cnt + ")";
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
390
7.4.2 Beispiel: Hello-World mit Axis2 ...
➥ Das Client-Programm HelloClient.java:
import hello.*;
public class HelloClient
{
public static void main(String[] args) throws Exception
{
HelloWorldStub stub;
// Referenz auf Stub holen
stub = new HelloWorldStub();
// Methoden des Dienstes aufrufen
System.out.println(stub.sayHello("Roland"));
System.out.println(stub.sayHello("Frank"));
}
}
➥ Vollständiger Beispielcode: siehe WWW
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (13/15)
391
Client/Server-Programmierung
WS 2014/2015
16.01.2014
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
xiv
7.4 Web Services mit Axis2 ...
7.4.3 Details zu den Axis2-Werkzeugen
axis2.sh
➥ ruft java mit nötigem CLASSPATH und Java Properties auf
➥ nützlich zum Start von Clients
java2wsdl.sh
➥ erzeugt WSDL-Dokument aus Java-Schnittstelle
➥ wichtige Optionen:
➥ -l: gewünschte URL des Web Services (Endpunkt)
➥ -cn: (qualifizierter) Name der Klasse
➥ -of: Name der Ausgabedatei
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
392
7.4.3 Details zu den Axis2-Werkzeugen ...
java2wsdl.sh: Beispiel
public interface HelloWorld {
public String sayHello (String name);
}
java2wsdl.sh −cn HelloWorld
−l http://localhost:8080/axis2/services/Hello
...
<wsdl:message name="sayHelloRequest">
<wsdl:part name="parameters" element="ns:sayHello"/>
</wsdl:message>
...
<wsdl:portType name="HelloWorldPortType">
... <wsdl:operation name="sayHello">
<wsdl:binding name="HelloWorldSoap11Binding"
type="ns:HelloWorldPortType">
...
<wsdl:service name="HelloWorld">
<wsdl:port name="HelloWorldHttpSoap11Endpoint"
binding="ns:HelloWorldSoap11Binding">
<wsdlsoap:address
location="http://localhost:8080/axis2/services/Hello"/>
...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
393
7.4.3 Details zu den Axis2-Werkzeugen ...
wsdl2java.sh
➥ erzeugt aus einem WSDL-Dokument u.a.:
➥ Rahmen für die Java-Implementierungsklasse:
src/Paket /Service Skeleton.java
➥ Service-Deskriptor resources/services.xml
➥ Build-Skript build.xml für ant
➥
➥
Target jar.server für Server-Archiv
Target jar.client für Client-Archiv
➥ Client-Stub für den Web-Service:
src/Paket /Service Stub.java
➥
➥
Default-Konstruktor: Endpunkt aus WSDL-Dokument
weiterer Konstruktor erlaubt Angabe der Endpunkt-URL als
String
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
394
7.4.3 Details zu den Axis2-Werkzeugen ...
wsdl2java.sh ...
➥ wichtige Optionen:
➥ -d: Festlegung des Data Binding
➥ wie erfolgt die Umwandlung von XML-Dokumenten in
Java-Objekte? (adb, jibx, xmlbeans, jaxbri)
➥ -uw: Einschalten des Unwrapping
➥ das (einzige) XML-Element des SOAP-Body wird in
einzelne Parameter zerlegt
➥ -ss: Code-Erzeugung für Serverseite
➥ -sd: erzeuge Service-Deskriptor
➥ -p: Festlegung des Paketnamens
➥ -uri: Ort des WSDL-Dokuments
➥ -sn: Auswahl eines Services aus dem WSDL-Doument
➥ -pn: Auswahl eines Ports aus dem WSDL-Doument
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
395
7.4.3 Details zu den Axis2-Werkzeugen ...
Konstruktoren der Klasse Service Stub
➥ Service Stub()
➥ erzeugt Stub, der sich mit dem Endpunkt aus der WSDL-Datei
verbindet
➥ Festlegung ggf. über Option -pn von wsdl2java.sh
➥ Service Stub(String targetEndpoint)
➥ erzeugt Stub, der sich mit dem (als URL) gegebenen
Endpunkt verbindet
(Service ist der Name der Services aus der WSDL-Datei)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
396
7.4.3 Details zu den Axis2-Werkzeugen ...
Abbildung von Datentypen von XML auf Java durch Axis2
➥ XML-Schema aus WSDL muß in Java-Klassen umgesetzt werden
➥ prinzipiell: je eine Klasse für Anfrage- und Ergebnisnachricht
➥
mit get- und set-Methoden für einzelne Komponenten
➥ zusätzlich möglich: unwrapping
➥
➥
entfernt Wrapper-Klasse von document/literal/wrapped
Argumente können einzeln an Operation übergeben
werden
➥ wsdl2java.sh unterstützt mehrere Möglichkeiten (data bindings):
➥ adb: beste Integration mit Axis2
➥ xmlbeans: vollständigste Unterstützung von XML-Schema
➥ jibx: kann mit existierenden Java-Klassen arbeiten, beste
Unterstützung für unwrapping
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
397
7.4.3 Details zu den Axis2-Werkzeugen ...
Abbildung von Datentypen von XML auf Java durch Axis2 ...
➥ Falls WSDL-Datei durch java2wsdl.sh erzeugt wird:
wsdl2java.sh liefert auch mit unwrapping evtl. nicht mehr die
ursprüngliche Schnittstelle
➥ Umsetzung ist i.a. problemlos für
➥ einfache Datentypen (int, double, boolean, ...)
➥ Arrays und Strings
➥ Remote-Referenzen auf Objekte sind mit Axis2 (und SOAP) nicht
möglich!
➥ im Bedarfsfall muß ggf. mit selbst implementierten Objekt-IDs
gearbeitet werden
➥
Server muß Abbildung von Objekt-ID auf Objekt pflegen
➥ besser: WS-Resource Standard verwenden
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
398
7.4.3 Details zu den Axis2-Werkzeugen ...
Service-Deskriptor
<serviceGroup>
<service name="HelloWorld">
<messageReceivers>
<messageReceiver mep="http://www.w3.org/ns/wsdl/in-out"
class="hello.HelloWorldMessageReceiverInOut"/>
</messageReceivers>
<parameter name="ServiceClass">hello.HelloWorldSkeleton</paramete
<parameter name="useOriginalwsdl">true</parameter>
<parameter name="modifyUserWSDLPortAddress">true</parameter>
<operation name="sayHello"
mep="http://www.w3.org/ns/wsdl/in-out"
namespace="http://ws.apache.org/axis2">
<actionMapping>urn:sayHello</actionMapping>
<outputActionMapping>urn:sayHelloResponse</outputActionMapping
</operation>
</service>
</serviceGroup>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
399
7.4.3 Details zu den Axis2-Werkzeugen ...
Wichtige Elemente im Service-Deskriptor
➥ Parameter modifyUserWSDLPortAddress
➥ falls true: Axis2-Container ersetzt angegebene Port-Adresse
durch seine eigene
➥
Probleme z.B. mit NAT und Web-Proxies
➥ im Labor H-A 4111 auf false setzen
➥ Attribut scope des service-Tags
➥ für Sitzungsverwaltung
➥ mögliche Werte: request, soapsession, transportsession,
application
➥ siehe Abschnitt 7.4.4
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
400
7.4.3 Details zu den Axis2-Werkzeugen ...
Ablauf der Kommunikation
Client
POST /axis2/services/HelloWorld HTTP/1.1
Content−Type: application/soap+xml;
charset=UTF−8; action="urn:sayHello"
...
<?xml version="1.0" encoding="UTF−8"?>
<soapenv:Envelope ...>...<soapenv:Body>
<sayHello ...><args0>Roland</args0></sayHello>
...
HTTP/1.1 200 OK
Server: Apache−Coyote/1.1
Content−Type:application/soap+xml;action=
... "urn:sayHelloResponse";charset=UTF−8
<?xml version="1.0" encoding="UTF−8"?>
<soapenv:Envelope ...>...<soapenv:Body>
<sayHelloResponse ...><return>Hello to
Roland</return></sayHelloResponse>
...
"Roland"
Roland Wismüller
Betriebssysteme / verteilte Systeme
Server
Tomcat
Web−
Server
<?xml version
<soapenv:Env
<sayHello ...>
...
doPost()
<?xml version
<soapenv:Env
<sayHelloRes
...
Axis2
Servlet
sayHello()
HelloWorld
Client/Server-Programmierung (14/15)
"Hello to Roland"
401
7.4 Web Services mit Axis2 ...
7.4.4 Sitzungs-Management mit Axis2
➥ Sitzungs-Management ermöglicht, in einem Web-Service einen
client-spezifischen Zustand zu verwalten
➥ Manuell programmiertes Sitzungs-Management:
➥ es gibt genau eine Instanz der Implementierungs-Klasse
➥ jede Operation erhält Sitzungs-ID als zusätzlichen Parameter
➥
Abbildung der Sitzungs-ID auf Sitzungsdaten z.B. über
Hash-Tabelle
➥ zusätzliche Methode zum Erzeugen einer Sitzungs-ID
➥ Sitzungs-Management mit Hilfe von Axis:
➥ eine Instanz der Implementierungs-Klasse pro Sitzung
➥ automatische Verfolgung der Sitzungen über generierte
Sitzungs-IDs in HTTP-Cookies oder im SOAP-Header
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
402
7.4.4 Sitzungs-Management mit Axis2 ...
Realisierung des Sitzungs-Managements
➥ Spezifikation des Session Scopes im Deployment-Deskriptor des
Dienstes, z.B.:
<serviceGroup>
<service name="HelloWorld" scope="soapsession">
...
➥ Mögliche Werte:
➥
➥
➥
➥
request: keine Sitzungen, Dienst ist zustandslos
transportsession: verwende Sitzung der Transport-Ebene
soapsession: Sitzung durch SOAP realisiert
application: genau eine Instanz für alle Nachrichten
➥ Einschalten des Sitzungs-Managements im Client:
HelloWorldStub stub = new HelloWorldStub();
stub._getServiceClient().getOptions().setManageSession(true);
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
403
7.4.4 Sitzungs-Management mit Axis2 ...
Beispiel zum Sitzungs-Management
➥ Implementierung des Dienstes:
public class HelloWorldSkeleton {
int cnt = 1; // Zählervariable als (sitzungslokaler) Zustand
public String sayHello(String to) {
return "Hello to " + to + " (" + cnt++ + ")";
}
// Lebenszyklus−Methoden: werden von Axis2 (über Reflection)
// aufgerufen, wenn Session erzeugt bzw. gelöscht wird
public void init(ServiceContext context) { ... }
public void destroy(ServiceContext context) { ... }
}
➥ Deployment-Deskriptor:
<serviceGroup>
<service name="HelloWorld" scope="transportsession">
...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
404
7.4.4 Sitzungs-Management mit Axis2 ...
Beispiel zum Sitzungs-Management ...
➥ Implementierung des Clients:
public class HelloClient {
public static void main(String[] args) throws Exception {
HelloWorldStub stub = new HelloWorldStub();
// Sitzungs-Verfolgung einschalten
stub. getServiceClient().getOptions()
.setManageSession(true);
System.out.println(stub.sayHello("Roland"));
System.out.println(stub.sayHello("Adrian"));
System.out.println(stub.sayHello("Andreas"));
}
}
➥ Vollständiges Beispiel im WWW
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
405
7.4.4 Sitzungs-Management mit Axis2 ...
Sitzungs-Management mit HTTP-Cookies
➥ Eintrag im Deployment-Deskriptor:
<service name="HelloWorld" scope="transportsession">
➥ Axis-Server setzt bei jeder Antwort über HTTP ein Cookie, das
der Client beim nächsten Aufruf zurückschickt
➥ Problem: Interoperabilität
➥ HTTP als Transportprotokoll vorausgesetzt
➥ Nicht-Java-Client kann evtl. Cookie nicht zurücksenden
➥
kein direkter Zugriff auf HTTP-Anfrage
➥ Vorteil: Sitzungen über Dienstgruppen hinweg möglich
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
406
7.4.4 Sitzungs-Management mit Axis2 ...
Ablauf der Kommunikation im Beispiel
Client
POST /axis2/services/HelloWorld HTTP/1.1
...
Server
<?xml . . .
1
HTTP/1.1 200 OK
...
Set−Cookie: JSESSIONID=66CFAB...; Path=/axis2
...
Tomcat
Web−
Server
doPost()
<?xml . . .
POST /axis2/services/HelloWorld HTTP/1.1
...
Cookie: JSESSIONID=66CFAB...; Path=/axis2
Axis2
Servlet
<?xml . . .
2
HTTP/1.1 200 OK
...
<?xml . . .
Roland Wismüller
Betriebssysteme / verteilte Systeme
HelloWorld
HelloWorld
HelloWorld
Client/Server-Programmierung (14/15)
407
7.4.4 Sitzungs-Management mit Axis2 ...
Sitzungs-Management über SOAP-Header
➥ Eintrag im Deployment-Deskriptor:
<service name="HelloWorld" scope="soapsession">
➥ Zusätzlich muß WS-Addressing Modul im Server und im Client
aktiviert sein (Standard bei Axis2)
➥ Handler modifizieren bzw. analysieren den SOAP-Header
➥ Server fügt bei jeder Antwort ServiceGroupId ein
➥ Client sendet diese bei Folgeanfragen zurück
➥ Vorteile:
➥ unabhängig vom Transportprotokoll
➥ Auslesen und Einfügen des SOAP-Headers notfalls per Hand
im Client implementierbar
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
408
7.4.4 Sitzungs-Management mit Axis2 ...
Ablauf der Kommunikation im Beispiel
Client
1
POST /axis2/services/HelloWorld HTTP/1.1
...
<?xml . . .
HTTP/1.1 200 OK
...
<?xml ...><Envelope ...><Header ...>
<wsa:ReplyTo>...<wsa:ReferenceParameters>
<axis2:ServiceGroupId ...>urn:uuid:4DE801025...
...
POST /axis2/services/HelloWorld HTTP/1.1
...
<?xml ...><Envelope ...><Header ...>
<axis2:ServiceGroupId ...>urn:uuid:4DE801025...
...
2
Server
HTTP/1.1 200 OK
...
<?xml ...><Envelope ...><Header ...>
<wsa:ReplyTo>...<wsa:ReferenceParameters>
<axis2:ServiceGroupId ...>urn:uuid:4DE801025...
...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Tomcat
Web−
Server
doPost()
Axis2
Servlet
HelloWorld
HelloWorld
HelloWorld
Client/Server-Programmierung (14/15)
409
7.4 Web Services mit Axis2 ...
7.4.5 Axis2 Module
➥ Bearbeitung von SOAP-Nachrichten in Axis2 ist über Module
erweiterbar
➥ Modul enthält einen oder mehrere Handler
➥ Handler inspizieren bzw. manipulieren SOAP-Nachrichten
➥ Anwendungen z.B.
➥
➥
➥
➥
Sicherheit (WS-Security, Rampart-Modul)
➥ Authentifizierung, Verschlüsselung
Adressierung (WS-Addressing)
Zuverlässige Kommunikation (WS-ReliableMessaging)
Debugging / Monitoring / Logging / Accounting ...
➥ Vorteil: Trennung von Verwaltungs-Aufgaben und Anwendungslogik
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
410
7.4.5 Axis2 Module ...
➥ Module können zur Laufzeit eingebunden (engaged) werden
➥ global
➥ für Dienstgruppen und einzelne Dienste
➥ für einzelne Operationen
➥ Definition über Axis2 Konfigurationsdatei, Deployment-Deskriptor
oder Axis2 Web Admin
➥ $CATALINA BASE/webapps/axis2/WEB-INF/conf/axis2.xml
➥ resources/services.xml
➥ http://localhost:8080/axis2/axis2-admin/
➥ Beim Engagement eines Moduls werden dessen Handler in
definierte Phasen der Nachrichtenverarbeitung eingebunden
➥ Spezifikation über Modul-Deskriptor META INF/module.xml
➥ Phasen sind in Axis2 Konfigurationsdatei festgelegt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
411
7.4.5 Axis2 Module ...
Handler
Web
Service
SOAP
Message
Receiver
Handler
In Pipe
Transport
Listener
Out Pipe
Transport
Sender
Client−API
Client
Nachrichtenverarbeitung in Axis2
➥ Vier Datenflüsse: InFlow, OutFlow, InFaultFlow, OutFaultFlow
➥ Jeder Datenfluss wird in mehreren Phasen bearbeitet
➥ z.B. Transport, Pre-Dispatch, Dispatch, Message Processing
für InFlow
➥ Jede Phase besteht aus beliebig vielen Handlern
➥ Phasen legen Ausführungsreihenfolge der Handler fest
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
412
7.4.5 Axis2 Module ...
Beispiel: Hello World mit Logging
➥ Vollständiger Code: siehe WWW
➥ Dienst-Implementierung bleibt unverändert
➥ Aber: Einführung eines Moduls mit Handler für Anfrage- und
Antwort-Nachrichten
➥ LOGHANDLER/logger/LogModule.java
➥
i.w. leere Implementierung der Axis2-Schnittstelle Module
➥ LOGHANDLER/logger/LogHandler.java
➥
➥
gibt SOAP-Nachrichten auf Konsole aus
Parameter im Deployment-Deskriptor gibt Präfix an, das
jeder Ausgabe vorangestellt wird
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
413
7.4.5 Axis2 Module ...
Beispiel: Hello World mit Logging ...
➥ Code des Handlers LOGHANDLER/logger/LogHandler.java:
public class LogHandler extends AbstractHandler {
public InvocationResponse invoke(MessageContext context)
throws AxisFault {
// Parameter aus Deployment−Deskriptor holen
String pre = "";
Parameter p = getParameter("prefix");
if (p != null)
pre = (String)p.getValue();
// SOAP−Nachricht ausgeben
System.out.println(pre + context.getEnvelope());
return InvocationResponse.CONTINUE;
}
}
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
414
7.4.5 Axis2 Module ...
Beispiel: Hello World mit Logging ...
➥ Deployment-Deskriptor des Moduls
(LOGHANDLER/META-INF/module.xml):
<module name="logger" class="logger.LogModule">
<InFlow>
<handler name="InFlowLogHandler" class="logger.LogHandler">
<order phase="loggingPhase" />
<parameter name="prefix">IN: </parameter>
</handler>
</InFlow>
...
➥ Voraussetzung: loggingPhase ist in Axis2 Konfiguration definiert
($CATALINA BASE/webapps/axis2/WEB-INF/conf/axis2.xml):
<phaseOrder type="InFlow">
<phase name="Transport"> ... </phase>
...
<phase name="loggingPhase"/>
...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
415
7.4.5 Axis2 Module ...
Beispiel: Hello World mit Logging ...
➥ Deployment des Moduls: Packen des Deployment-Deskriptors
und der Klassen in ein Archiv logger.mar und Kopie nach
$CATALINA BASE/webapps/axis2/WEB-INF/modules
➥ Engagement des Moduls im Deployment-Deskriptor des Services
(SERVER/resources/services.xml):
➥ für den kompletten Dienst:
...
<service name="HelloWorld">
<module ref="logger"/>
...
➥ für eine spezifische Operation:
...
<operation name="sayHello" mep="http://www.w3..." ...>
<module ref="logger"/>
...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
416
7.4.5 Axis2 Module ...
Anmerkungen zum Beispiel
➥ Handler erbt von org.apache.axis2.handlers.AbstractHandler
und überschreibt invoke(MessageContext context)
➥ Methode getParameter() von AbstractHandler erlaubt
Zugriff auf die im Deployment-Deskriptor gesetzten Parameter
➥ Methoden von org.apache.axis2.context.MessageContext:
➥ getEnvelope(): liefert Objekt-Repräsentation der SOAP
Nachricht
➥ getProperty(String name): liefert Wert einer gegebenen
Property aus MessageContext
➥ getPropertyNames(): liefert Iterator für alle Property-Namen
➥ etliche weitere Verwaltungsmethoden
➥
i.w. undokumentiert ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
417
7 Web Services ...
7.5 Web Services und Sicherheit
➥ Mögliche Maßnahmen zur Absicherung von Web Services:
➥ Nutzung von HTTP über TLS/SSL
➥
➥
➥
Verschlüsselung (⇒ Vertraulichkeit, Integrität)
Authentifizierung des Servers über Zertifikat
Authentifizierung des Clients (durch den Web-Server!)
➥ über Zertifikat möglich
➥ meist aber nur über Name und Paßwort
➥ Nutzung der WS Security Paradigmen
➥
➥
Verschlüsselung von Teilen einer SOAP-Nachricht
digitale Signatur über Teile einer SOAP-Nachricht
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
418
7.5 Web Services und Sicherheit ...
7.5.1 Nutzung von Tomcat6 mit TLS/SSL
➥ Zunächst: Erstellung eines Server-Zertifikats
➥ einfachste Möglichkeit: Verwendung des Java keytools:
➥
➥
keytool -genkey -alias tomcat -keyalg RSA
➥ Key Paßwort und Keystore Paßwort müssen gleich sein!
erzeugt selbstsigniertes Zertifikat (führt zu Warnung im
Web Browser)
➥ i.d.R. muß das Zertifikat von einer Zertifizierungsstelle signiert
werden
➥ dazu: Verwendung der OpenSSL Werkzeuge und
Exportieren des Zertifikats im PKCS12-Format
➥ siehe Dokumentation von Tomcat und OpenSSL
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
419
7.5.1 Nutzung von Tomcat6 mit TLS/SSL ...
➥ Anpassen der Datei $CATALINA_BASE/conf/server.xml:
➥ Einfügen eines <Connector>-Elements für den SSL Port:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/home/wismueller/.keystore"
keystorePass="passwd1" />
➥
Vorlage bereits als Kommentar vorhanden
➥ Evtl. Löschen des <Connector>-Elements für den nicht-SSL
Port
➥ Web Services nun über https://host :8443/axis2/...
erreichbar
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (14/15)
420
Client/Server-Programmierung
WS 2014/2015
23.01.2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
rolanda
.d
[email protected] e
Tel.: 0271/740-4050, Büro: H-B 8404
Stand: 23. Januar 2015
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
xv
7.5 Web Services und Sicherheit ...
7.5.2 Passwort-Authentifizierung mit Tomcat6 und Axis2
➥ Zugriff auf Web-Service in Axis2 einschränken
($CATALINA BASE/webapps/axis2/WEB-INF/web.xml):
<security-constraint>
<web-resource-collection>
<web-resource-name>Axis services</web-resource-name>
<url-pattern>/services/HelloWorld</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Axis Services</realm-name>
</login-config>
<security-role>
<role-name>manager</role-name>
</security-role>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
421
7.5.2 Passwort-Authentifizierung mit Tomcat6 und Axis2 ...
➥ Rolle und Benutzer in Tomcat konfigurieren
($CATALINA BASE/conf/tomcat-users.xml):
<tomcat-users>
<role rolename="manager"/>
<user username="admin" password="s3cret" roles="manager"/>
</tomcat-users>
➥ Bentuzer und Paßwort im Client übergeben:
HelloWorldStub stub = new HelloWorldStub();
HttpTransportProperties.Authenticator auth
= new HttpTransportProperties.Authenticator();
auth.setUsername("admin");
auth.setPassword("s3cret");
auth.setPreemptiveAuthentication(true);
stub._getServiceClient().getOptions()
.setProperty(HTTPConstants.AUTHENTICATE, auth);
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
422
7.5 Web Services und Sicherheit ...
7.5.3 Nutzung der WS Security Paradigmen
➥ Probleme bei Verwendung von HTTP/SSL:
➥ keine Verbindlichkeit (keine digitale Signatur)
➥ Verschlüsselung der gesamten SOAP-Nachricht oft unnötig
➥ keine Ende-zu-Ende-Sicherheit (Verschlüsselung) bei
SOAP-Nachrichten über Zwischenknoten möglch
➥ Lösung: Verschlüsselung / Signierung von Teilen der SOAPNachricht mittels XML Encryption bzw. XML Signature
➥ WS Security ist ein Standard, der u.a. festlegt, wie
➥ kryptographische Information (z.B. Schlüssel, Zertifikate,
digitale Signaturen)
➥ Authentifizierungsinformation (z.B. Benutzername/Paßwort)
im SOAP-Header abgelegt werden
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
423
7.5.3 Nutzung der WS Security Paradigmen ...
Verschlüsselung von SOAP-Nachrichten
➥ Basis: XML Encryption, erlaubt die Verschlüsselung verschiedener Teile eines XML-Dokuments:
➥ das komplette XML-Dokument,
➥ einzelne Elemente mit ihren Unterelementen
➥ oder nur der Inhalt einzelner Elemente
➥ Verschlüsselte Teile werden durch <EncryptedData>-Elemente
ersetzt
➥ mögliche Unterelemente u.a. für Name des Verschlüsselungs-
algorithmus, Schlüsselinformation, Chiffretext
➥ SOAP-Header enthält Referenzen auf alle verschlüsselten Teile
des Body
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
424
7.5.3 Nutzung der WS Security Paradigmen ...
Beispiel für eine verschlüsselte SOAP-Nachricht
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsse="http://docs.oasis−open.org/wss/2004/01/oasis−200401−
wss−wssecurity−secext−1.0.xsd"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<env:Header>
<wsse:Security>
Security−Header−Block
<xenc:ReferenceList>
zeigt an, daß Inhalt
<xenc:DataReference URI="#bodyID"/> des SOAP−Bodies
</xenc:ReferenceList>
verschlüsselt ist
</wsse:Security>
</env:Header>
Verschlüsselter Element−Inhalt
<env:Body>
<xenc:EncryptedData Id="bodyID">
<ds:KeyInfo>
<ds:KeyName>CN=Ali Baba, C=DE</ds:KeyName> Schlüsselname
</ds:KeyInfo>
<xenc:EncryptionMethod Algorithm="..."/> Verschlüsselungsalgorithmus
<xenc:CipherData>
<xenc:CipherValue>39kDeFAl...</xenc:CipherValue> Chiffretext
</xenc:CipherData>
</xenc:EncryptedData>
</env:Body>
</env:Envelope>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
425
7.5.3 Nutzung der WS Security Paradigmen ...
Signierung von SOAP-Nachrichten
➥ Basis: XML Signature, erlaubt das (gemeinsame) Signieren verschiedener Teile eines XML-Dokuments
➥ Signatur-Element wird in SOAP-Header eingebettet und verweist
auf signierte Elemente im Body
➥ Body bleibt unverändert, d.h. SOAP-Knoten können digitale
Signatur auch ignorieren
➥ Signatur-Element enthält u.a.:
➥ Referenz auf die signierte Information
➥ Angabe der verwendeten Algorithmen
➥ Zertifikat, einschließlich des öffentlichen Schlüssels
➥ die digitale Signatur selbst
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
426
7.5.3 Nutzung der WS Security Paradigmen ...
Beispiel für eine signierte SOAP-Nachricht
<env:Envelope ...>
<env:Header>
<wsse:Security>
X509−Zertifikat, binär, Base64−codiert
<wsse:BinarySecurityToken ValueType="...#X509v3"
EncodingType="...#Base64Binary" wsu:Id="X509Token">
MIIEZzCCA9CgAwIBA...
</wsse:BinarySecurityToken>
<ds:Signature>
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="..."/>
<ds:SignatureMethod Algorithm= ".../xmldsig#rsa−sha1"/>
<ds:Reference URI="#myBody">
Referenz auf signiertes
<ds:Transforms>
Element
<ds:Transform Algorithm="..."/>
</ds:Transforms>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
427
7.5.3 Nutzung der WS Security Paradigmen ...
Beispiel für eine signierte SOAP-Nachricht ...
<ds:DigestMethod Algorithm=".../xmldsig#sha1"/>
<ds:DigestValue>EULddytSo1...</ds:DigestValue>
</ds:Reference>
Hashwert für dieses Element
</ds:SignedInfo>
<ds:SignatureValue>BL8jdfTPOV...</ds:SignatureValue>
<ds:KeyInfo>
Signatur für dieses Element
<wsse:SecurityTokenReference>
<wsse:Reference URI="#X509Token"/> Angaben zum Signatur−
</wsse:SecurityTokenReference>
schlüssel (Verweis auf
</ds:KeyInfo>
obiges Zertifikat)
</ds:Signature>
</wsse:Security>
</env:Header>
<env:Body wsu:Id="myBody">
<tru:StockSymbol xmlns:...">IBM</tru:StockSymbol>
</env:Body>
</env:Envelope>
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
428
7.5.3 Nutzung der WS Security Paradigmen ...
Praktische Nutzung von WS Security mit Axis2
➥ Erweiterungs-Modul Rampart
➥ Definiert Axis2 Handler, die ein- und ausgehende SOAP-Nachrichten bearbeiten
➥ Ver- bzw. Entschlüsselung von Elementen
➥ Erzeugung bzw. Prüfung von Signaturen
➥ Rampart nutzt dazu die Bibliotheken der Apache-Projekte
➥ WSS4J (WS Security )
➥ XML Security (XML Encryption und XML Signature)
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
429
7 Web Services ...
7.6 Zusammenfassung
➥ Grundlage von Web Services: RPC-Mechanismus
➥ XML-basiertes Kommunikationsprotokoll: SOAP
➥ WSDL als IDL, definiert zusätzlich Adresse des Dienstes
➥ kein verteiltes Objektmodell
➥ unabhängig von Plattform, Implementierungssprache und
Transportprotokoll
➥ Axis2 als verbreitetes Web Service Framework
➥ automatische Erzeugung von WSDL-Dokumenten und
Client-Stubs
➥ Axis2 Handler erlauben direkten Zugriff auf SOAP-Nachrichten
➥
z.B. für Logging, Accounting, Sitzungsverwaltung,
Verschlüsselung und Signierung, ...
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
430
Client/Server-Programmierung
WS 2014/2015
8
Weitere Client/Server-Technologien
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
431
8 Weitere Client/Server-Technologien ...
8.1 Technologien zur Netzwerkprogrammierung
➥ Sockets: plattform- und netzwerkunabhängiges KommunikationsAPI (Basis jeglicher Client/Server-Kommunikation)
➥ Socket = Abstraktion für Kommunikations-Endpunkt
➥ Datagramm- und Stream-Sockets
➥
bei Verwendung der IP-Protokolle: direkte Kommunikation
über UDP bzw. TCP
➥ Java bietet vereinfachtes API zur Socket-Kommunikation
➥ Literatur:
➥
➥
➥
Folien-Skript ”Rechnernetze II”, Kap. 8.1
W.R. Stevens: Programmieren von UNIX-Netzen, Hanser /
Prentice Hall, 1992.
T. Langner: Verteilte Anwendungen mit Java, Markt + Technik, 2002. Kap. 3
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
432
8.1 Technologien zur Netzwerkprogrammierung ...
➥ Sun RPC: einfache RPC-Implementierung
➥ einfache IDL, Bindung i.W. nur für C
➥ sehr eingeschränkt (z.B. nur ein Parameter pro Prozedur)
➥ Literatur:
➥
➥
Folien-Skript Rechnernetze II“ (WS 08/09), Kap. 9.2
”
W.R. Stevens: Programmieren von UNIX-Netzen, Hanser /
Prentice Hall, 1992.
➥ DCE RPC: Weiterentwicklung, Basis von Microsoft DCOM
➥ IDL mit Bindung an verschiedene Programmiersprachen
➥ Schnittstellen an Objekte statt Maschinen gebunden
➥ weltweit eindeutige ID (UUID) für jede Schnittstelle
➥ Literatur: A. Tanenbaum, M. van Steen: Verteilte Systeme,
Pearson Studium, 2003, Kap. 2.2
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
433
8 Weitere Client/Server-Technologien ...
8.2 Technologien für dynamische WWW-Seiten
➥ CGI-Skripten (Common Gateway Interface)
➥ ausführbare Programme (in beliebigen Sprachen) werden
beim Web-Server für bestimmte URLs registriert
➥ bei Aufruf der URL startet Web-Server das CGI-Programm als
eigenen Prozeß
➥
➥
➥
Standard-Eingabe: Rumpf der HTTP-Anfrage
➥ d.h. Anfrage-Parameter bei POST-Methode
Standard-Ausgabe: Rumpf der HTTP-Antwort
Zusätzliche Information durch Umgebungsvariablen, z.B.
QUERY_STRING: Parameterstring in der URL nach dem ?
➥ Vorläufer von Servlets
➥ Literatur: Orfali/Harkey, Kap. 11
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
434
8.2 Technologien für dynamische WWW-Seiten ...
➥ PHP (PHP: Hypertext Preprocessor )
➥ Skript-Sprache, in HTML-Dokumente eingebettet
➥
➥
innerhalb von Tags <?php ... ?>
ab PHP 4 mit objektorientierten Konzepten
➥ ähnlich zu JSP, aber interpretierte Abarbeitung
➥ Literatur: http://www.php.net/
➥ ASP (Active Server Pages)
➥ Integration verschiedener Skript-Sprachen (u.a. VB Script,
JScript) in HTML-Dokumente
➥ innerhalb von Tags <% ... %> (Vorbild für JSP)
➥ ASP zunächst interpretiert, bei ASP.NET Vorkompilation des
Codes analog zu JSP
➥ Literatur: http://www.asp.net/
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
435
8 Weitere Client/Server-Technologien ...
8.3 Microsoft .Net und DCOM
➥ Konkurrenz / Analogie zu J2EE von Oracle
➥ Das .Net-Framework definiert:
➥ einheitliche Laufzeitumgebung für alle Microsoft-Sprachen
(z.B. Visual Basic, Visual C++, C#)
➥ einheitliche Zwischensprache (CIL) mit JIT-Übersetzung
➥ einheitliches Typsystem, Garbage Collection, Threads,
Sandboxing, Ausnahmen ...
➥ gemeinsame Klassenbibliothek (etwa analog zu J2EE)
➥ u.a. Realisierung von ASP.Net und ADO.Net (Datenbank-Zugriff, vergleichbar zu JDBC)
➥ Zusätzlich: Komponentenmodell COM+
➥ DCOM mit MS Transaction und Message Queue Server
➥ Kommunikation: u.a. DCOM, .Net-Remoting, Web Services
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
436
8.3 Microsoft .Net und DCOM ...
COM / DCOM (Distributed Component Object Model)
➥ Sprachunabhängiges Komponentenmodell
➥ COM-Schnittstelle:
➥ binäres API einer Komponente (Array von Funktionszeigern)
➥ identifiziert durch GUID (Globally Unique Identifier )
➥
identisch mit UUID von DCE-RPC
➥ beschrieben in DCOM IDL
➥ unveränderbar, ggf. muß neue Schnittstelle erzeugt werden
➥ COM-Objekt:
➥ Instanz einer Komponente
➥ implementiert eine oder mehrere COM-Schnittstellen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
437
8.3 Microsoft .Net und DCOM ...
COM / DCOM (Distributed Component Object Model) ...
➥ Die Schnittstelle IUnknown:
➥ muß von jeder COM-Schnittstelle geerbt werden
➥ definiert die Methoden
➥
QueryInterface(): liefert zu einer über die GUID
gegebene Schnittstelle den Zeiger auf diese Schnittstelle
zurück
➥
➥
bzw. Fehler, falls Schnittstelle nicht unterstützt wird
AddRef() / Release(): Referenz-Zähler
➥ Für jede COM-Komponente muß eine Factory realisiert werden
➥ u.a. Methode CreateInstance() zur Erzeugung neuer
Komponenten-Instanzen
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
438
8.3 Microsoft .Net und DCOM ...
COM / DCOM (Distributed Component Object Model) ...
COM−Objekt
Client
Schnittstellen−
Zeiger
Interner Zeiger auf
Methoden−Tabelle
Zeiger auf Methode 1
Zeiger auf Methode 2
Zeiger auf Methode 3
Zeiger auf Methode 4
Zeiger auf Methode 5
Methoden−Tabelle
Roland Wismüller
Betriebssysteme / verteilte Systeme
QueryInterface() { ... }
AddRef() { ... }
Release() { ... }
"geerbt" von
IUnknown
➥ Aufbau einer COM-Schnittstelle:
sayHello() { ... }
sayGoodby() { ... }
Methoden−Code
Client/Server-Programmierung (15/15)
439
8.3 Microsoft .Net und DCOM ...
COM / DCOM (Distributed Component Object Model) ...
➥ COM-Server: ”Verpackungseinheit” von COM-Komponenten
➥ DLL, ausführbare Datei (*.exe), Java-Klasse, ...
➥ enthält Code einer / mehrerer Komponenten, Factories,
Registrierungs- und Verwaltungsinformation
➥ COM-Server kann lokalisiert sein:
➥ im lokalen Prozeß (realisiert als DLL)
➥ in eigenem Prozeß auf dem lokalen Rechner (COM-Server ist
ausführbares Programm)
➥ in eigenem Prozeß auf entferntem Rechner (bei DCOM)
➥
auch Remote-Instantiierung möglich
➥ DCOM realisiert Zugriffs- und Ortstransparenz
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
440
8.3 Microsoft .Net und DCOM ...
Unterschiede zw. COM-Objekten und üblichen Objekten
➥ In COM existiert keine Objekt-ID
➥ COM-Client erhält Referenz auf eine (zustandslose) Schnitt-
stelle, nicht auf ein Objekt
➥ Client kann sich nicht mit bestimmter Instanz einer Kompo-
nente verbinden (Problem, falls Instanz Zustand hat)
➥ Abhilfe durch COM Monikers
➥ In COM gibt es keine Mehrfach-Vererbung von Schnittstellen
➥ stattdessen: Komponente bietet mehrere Schnittstellen
➥ Wiederverwendung von Komponenten durch
➥ Containment/Delegation: Weitergabe von Aufrufen
➥ Aggregation: QueryInterface() gibt Schnittstellen der
inneren Objekte nach außen bekannt
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
441
8.3 Microsoft .Net und DCOM ...
Containment/Delegation und Aggregation
Containment/Delegation:
Aggregation:
IUnknown
A
Äußeres Objekt A
IUnknown
A
Äußeres Objekt A
B
B
B
B
C
C
C
C
QueryInterface() gibt Schnittstel−
len des äußeren Objekts zurück.
Implementierung von A gibt
Aufrufe an B bzw. C weiter.
Roland Wismüller
Betriebssysteme / verteilte Systeme
QueryInterface() gibt Schnittstel−
le A des äußeren und Schnitt−
stellen B und C der inneren
Objekte zurück.
Client/Server-Programmierung (15/15)
442
8.3 Microsoft .Net und DCOM ...
➥ Literatur:
➥ Hammerschall, Kap. 10
➥ Orfali / Harkey, Kap. 15
➥ Hofmann / Jobst / Schabenberger, Kap. 3 und 4
➥ http://www.microsoft.com/com/
Roland Wismüller
Betriebssysteme / verteilte Systeme
Client/Server-Programmierung (15/15)
443
Herunterladen