Client/Server-Programmierung
|
|
|
- Carin Salzmann
- vor 10 Jahren
- Abrufe
Transkript
1 Client/Server-Programmierung WS 2014/2015 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) i Inhaltsverzeichnis 0 Organisation 2 1 Grundlagen: Wiederholung Architekturmodelle Zeit und Zustand in verteilten Systemen Middleware Kommunikationsorientierte Middleware Anwendungsorientierte Middleware Java RMI Hello World mit Java RMI
2 1.4.2 Parameterübergabe Java Database Connectivity (JDBC) Überblick Relationale Datenbanken und SQL Architektur von JDBC Ein Beispiel Details zu JDBC Zusammenfassung CORBA Einführung CORBA Architektur Object Management Architecture (OMA) Common Object Request Broker Architecture (COR- BA) CORBA-Dienste Hello World mit CORBA CORBA im Detail OMG IDL und Java-Mapping Name Service Factories Delegation und Tie-Klassen Statische und dynamische Aufrufe Portable Object Adapter (POA)
3 3.4.7 GIOP, IIOP und IOR Implementation Repository (IMR) Interface Repository (IR) Sicherheit Zusammenfassung RMI / IIOP Java Komponenten-Modelle Komponenten-Modelle Komponentenmodelle in Java EE JavaBeans Ereignisse Properties Persistenz Introspektion Zusammenfassung Enterprise Java Beans (EJB 3.0) Arten von EJBs Anatomie einer EJB-Anwendung Einschub: Java Annotationen Beispiel Hello World Einschub: OpenEJB Dienste des EJB-Containers Der Deployment-Deskriptor ejb-jar.xml
4 5.4.8 Session Beans: Details Entities: Details Transaktionen Zusammenfassung Servlets und JSP Servlets Grundlagen Einschub: Web-Server im Labor Beispiel: Hello-World Servlet Lebenszyklus eines Servlets Wichtige Klassen und Methoden Sitzungs-Management Java Server Pages (JSP) Spezielle Tags für JSP Vordefinierte Variablen Beispiele JSP Direktiven JSP und Java Beans Zusammenfassung Web Services Einführung Web-Service-Standards
5 7.2.1 XML (Extensible Markup Language) SOAP WSDL Nutzung von SOAP und WSDL Web-Services und EJB Web Services mit Axis Technisches zu Axis Beispiel: Hello-World mit Axis Details zu den Axis2-Werkzeugen Sitzungs-Management mit Axis Axis2 Module Web Services und Sicherheit Nutzung von Tomcat6 mit TLS/SSL Passwort-Authentifizierung mit Tomcat6 und Axis Nutzung der WS Security Paradigmen Zusammenfassung Weitere Client/Server-Technologien Technologien zur Netzwerkprogrammierung Technologien für dynamische WWW-Seiten Microsoft.Net und DCOM
6 Client/Server-Programmierung WS 2014/ Organisation 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 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 [email protected] Tel.: 0271/ Büro: H-B 8404 Sprechstunde: Mo., 14:15-15:15 Uhr Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 3
7 Zur Fachgruppe Betriebssysteme / verteilte Systeme Andreas Hoffmann andreas.hoffmann@uni siegen.de 0271/ H B 8405 Elektronische Prüfungs und Übungssysteme an Hochschulen IT Sicherheit Webtechnologien Mobile Anwendungen Julia Dauwe julia.dauwe@uni siegen.de 0271/ H B 8405 Context Aware Systems Bring Your Own Device (BYOD) Mobile Anwendungen und Datenschutz Adrian Kacso adrian.kacso@uni siegen.de 0271/ H B 8406 Kommunikationsprotokolle für drahtlose Sensornetze Kommunikation und Koordination in verteilten Systemen Betriebssysteme (RT, Embedded) Alexander Kordes alexander.kordes@uni siegen.de 0271/ H B 8407 Automotive Electronics Fahrzeugnetzwerke Robustheit, Fehleranalyse, Fehlerdetektion Betriebssysteme / verteilte Systeme 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 5
8 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 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: 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 7
9 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 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 9
10 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 oder persönlich (H-B 8403, nachmittags) Anmeldung beim Prüfungsamt Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 10 Organisatorisches zum Praktikum Benutzerordnung und Kartenschlüsselantrag: ws1415/csp Abgabe bis bis 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! Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 11
11 Rechnerumgebung im Labor H-A 4111 Linux-PCs, privates IP-Netz, beschränkter Internet-Zugang Fachgruppennetz (bs.informatik.uni siegen.de) / Internet Server Cluster bvsclk01 bvsclk02 bvsclk03 bvsclk04 (je 2 x XEON, je 2 Cores, 2,66 GHz, 4 GB) http bsclk01 bsclk02 bsclk03 bsclk04 ftp https (lab.bvs) Proxy ssh (nur pubkey) Labornetz 1 Gbit/s 13 Arbeitsplätze (Intel, 2 Cores mit HT, 6 Arbeitsplätze (Intel, 4 Cores, 3,3 GHz, 4 GB) 3,2 GHz, 4 GB) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) bslab01 06,11 12, File Server bslab07 10,13,19 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 13
12 Inhalt der Vorlesung... Servlets und JSP Web Services XML, SOAP, WSDL,... Axis2 Weitere Client/Server-Technologien u.a..net, DCOM Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 14 Zeitplan der Vorlesung (vorläufig!) Datum Montags-Termin Datum Freitags-Termin V: Grundlagen, Wdh V: Grundlagen, Wdh V: JDBC P: RMI V: CORBA V:CORBA V: CORBA P: RMI V: Java Beans P: RMI V: EJB P: CORBA V: EJB P: CORBA V: EJB P: CORBA V: Servlets, JSP P: CORBA V: Web Services P: EJB V: (ggf. P: EJB) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 15
13 Zeitplan der Vorlesung (vorläufig!)... Datum Montags-Termin Datum Freitags-Termin P: EJB V: Web Services P: EJB V: Web Services P: Web Services V: Weitere Technologien P: Web Services P: Web Services P: Web Services Ersatztermin Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 16 Literatur Allgemeinere Literatur Ulrike Hammerschall, Verteilte Systeme und Anwendungen. Pearson Studium, Robert Orfali, Dan Harkey, Client/Server-Programming with Java and Corba. John Wiley & Sons, Verteilte Systeme George Coulouris, Jean Dollimore, Tim Kindberg. Verteilte Systeme Konzepte und Design, 3. Auflage. Pearson Studium, Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 17
14 Literatur... Verteilte Programmierung mit Java Cay S. Horstmann, Gary Cornell. Core Java 2, Band 2 Expertenwissen. Sun Microsystems Press / Addison Wesley, Torsten Langner. Verteilte Anwendungen mit Java. Markt+Technik, Jim Farley, William Crawford, David Flanagan. Java Enterprise in a Nutshell, 3rd Edition. O Reilly, CORBA und COM Johann Hofmann, Fritz Jobst, Roland Schabenberger. Programmieren mit COM und CORBA, Hanser, 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, Bill Burke, Richard Monson-Haefel. Enterprise JavaBeans 3.0, 5th Edition. O Reilly, Servlets Jason Hunter, William Crawford. Java Servlet Programmierung. O Reilly, Web Services Manfred Hein, Henner Zeller. Java Web Services, Addison-Wesley, Torsten Langner. Web Services mit Java, Markt+Technik, Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 19
15 Client/Server-Programmierung WS 2014/ Grundlagen: Wiederholung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 20 1 Grundlagen: Wiederholung... Inhalt Architekturmodelle Zeit und Zustand in verteilten Systemen Middleware Java RMI Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 21
16 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 Aufruf Server Ergebnis Server Ergebnis Client Server kann selbst wieder als Client agieren Prozeß Rechner Häufigstes Modell für verteilte Anwendungen (ca. 80 %) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) Architekturmodelle... Client/Server-Modell... I.A. nebenläufige Anfragen mehrerer Client-Prozesse an den Server-Prozeß Start Client Ende Anfrage (request) Antwort (reply) Zeit Server Client Beispiele: Dateiserver, WWW-Server, DB-Server, DNS-Server,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 23
17 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) Architekturmodelle... 2-Tier-Architektur Client- und Server-Tier Keine eigene Tier für die Anwendungslogik Client Tier Server Tier Präsentation Anwendungslogik (Verteilung auf Client und Server Tier variiert) Datenhaltung Vorteil: einfach, performant Nachteil: schwer wartbar, schlecht skalierbar Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 25
18 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) Architekturmodelle... (Animierte Folie) Beispiel: typische Internet-Anwendung DMZ Intranet Web Client 01 Web Client Internet Firewall Web Server Firewall Web Server Anwen dungs Server Daten bank Server Tier 1 Tier 2 Tier 3 Tier 4 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 27
19 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 29
20 1.2 Zeit und Zustand in verteilten Systemen... Eine Auswirkung der Verteiltheit Szenario: zwei Prozesse beobachten zwei andere Prozesse x y z Beobachter A x y Prozess 1 Prozess 2 Beobachter B 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! Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 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,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 31
21 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) Middleware Verteilte Anwendung (VA) VA Komponente VS Knoten Netz VA Komponente VS Knoten Verteiltes System (VS) Verteilte Anwendung (VA) VA Komponente Middleware VS Knoten Netz VA Komponente Middleware 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 33
22 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) Kommunikationsorientierte Middleware Fokus: Bereitstellung einer Kommunikationsinfrastruktur für verteilte Anwendungen Aufgaben: Kommunikation Behandlung der Heterogenität Fehlerbehandlung Anwendung Kommunikationsorientierte Middleware Betriebssystem / verteiltes System Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 35
23 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) {... return b; Server 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 37
24 1.3.1 Kommunikationsorientierte Middleware... Funktionsweise der Client- und Server-Stubs (RPC) y=p(x) Client Prozeß P(a) { Client Stub return b; Server Skeleton while (true) { Argumente a in receive(m1); Nachricht m1 packen client=sender(m1); send(server, m1); Argumente x aus Nach richt m1 auspacken receive(server, m2) ; y = P(x) ; Ergebnis b aus Nach richt m2 auspacken Server Prozeß Ergebnis y in Nach richt m2 packen send(client, m2); P(a) {... return b; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 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 Proxy Objekt Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 39
25 1.3.1 Kommunikationsorientierte Middleware... Ablauf eines entfernten Methodenaufrufs Client Rechner Server Rechner Client ruft eine Methode auf Client Proxy Client BS Selbe Schnitt stelle wie beim Objekt Skeleton ruft dieselbe Methode für das Objekt auf Server Skeleton Server BS Objekt Status Methode Schnitt stelle Netzwerk Verpackter Aufruf wird über das Netzwerk weitergegeben (Objekt ID, Methodenname, Parameter) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) Kommunikationsorientierte Middleware... Erstellung eines Client/Server-Programms Server Prozeduren Compiler Server Server Skel. Schnittstellen beschreibung IDL Compiler Client Stubs RPC/RMI Laufzeit Bibliothek Client Programm Compiler Client Gilt prinzipiell für alle Realisierungen entfernten Aufrufe Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 41
26 1.3.2 Anwendungsorientierte Middleware Setzt auf kommunikationsorientierter Middleware auf Erweitert diese um: Laufzeitumgebung Dienste Komponentenmodell Anwendungs komponente Dienste Anwendungs komponente Komponentenmodell Laufzeitumgebung Anwendungs komponente Kommunikationsinfrastruktur Betriebssystem / verteiltes System Dienste Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 43
27 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (1/15) 44 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) ii
28 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) Java RMI Hello World mit Java RMI Client JVM Interface interface Hello { String sayhello(); Server JVM Client Klasse class HelloClient {... Hello h;... s = h.sayhello();... Server Klasse class HelloServer implements Hello { String sayhello() { return "Hello World";... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 46
29 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 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!) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 48
30 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 RemoteException zeigt Fehler im entfernten Objekt bzw. bei Kommu nikation an Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 50
31 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 52
32 1.4.1 Hello World mit Java RMI... Hello-World Server (2) public static void main(string args[]) { try { HelloServer obj = new HelloServer(); catch (Exception e) { Naming.rebind("rmi://localhost/Hello Server", obj); System.out.println("Error: " + e.getmessage()); e.printstacktrace(); Erzeugen des Server Objekts Registrieren des Server Objekts unter dem Namen "Hello Server" beim Name Server (RMI Registry, lokaler Rechner, Port 1099) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 54
33 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); catch (Exception e) {... Aufruf der Methode des entfernten Objekts Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 56
34 1.4.1 Hello World mit Java RMI... Übersetzen und Starten des Systems... HelloClient.java Hello.java HelloServer.java javac javac HelloClient.class Hello.class Hello.class HelloServer.class Client Seite bis JDK 1.4 rmic Server Seite HelloServer_Stub.class Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 58
35 Anmerkungen zu Folie 58: Im Beispiel wird angenommen, daß die Klasse Hello.class (und ggf. auch HelloServer Stub.class) im lokalen Classpath liegt: beim Starten von rmiregistry beim Starten von HelloServer beim Übersetzen und Starten von HelloClient Java RMI 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 59
36 1.4.2 Parameterübergabe... Übergabe eines serialisierbaren Objekts Original Client Objekt param Stub Objekt Skele ton Server Objekt op(param) param serialisieren Netz verbindung unabhängige Kopie param deserialisieren <<create>> op(param) param m() Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 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 paramstub deserialisieren <<create>> op(paramstub) param Stub m() Betriebssysteme / verteilte Systeme Client/Server-Programmierung (2/15) 61
37 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) iii Client/Server-Programmierung WS 2014/ Java Database Connectivity (JDBC) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 62
38 2 Java Database Connectivity (JDBC) Überblick Java-API zum portablen Zugriff auf relationale Datenbank- Systeme 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 63 2 Java Database Connectivity (JDBC) 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_ID AG_NAME BMW Siemens Thyssen ag_data ID AG_ID DAY VALUE Primär schlüssel Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 64
39 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 66
40 2 Java Database Connectivity (JDBC) Architektur von JDBC Java Anwendung JDCB Treiber Manager JDBC/ODBC Brücke ODBC Treiber Treiber für mysql Treiber für Oracle MS mysql Oracle SQL Server Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) Architektur von JDBC... Klassen des JDBC-Kerns java.sql <<interface>> Driver <<interface>> Connection <<interface>> Statement <<interface>> ResultSet DriverManager <<interface>> PreparedStatement <<interface>> ResultSetMetaData DriverPropertyInfo <<interface>> CallableStatement Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 68
41 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 70
42 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,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 71 2 Java Database Connectivity (JDBC) 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; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 72
43 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")); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 74
44 2 Java Database Connectivity (JDBC) 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... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 76
45 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! Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 78
46 2.5 Details zu JDBC... SQL-Datentypen und Zugriffsmethoden (Auswahl) SQL Typ(en) Java Typ Methode CHAR, VARCHAR String getstring() NUMERIC, DECIMAL java.math.bigdecimal getbigdecimal() BIT boolean getboolean() TINYINT byte getbyte() SMALLINT short getshort() INTEGER int getint() BIGINT long getlong() REAL float getfloat() FLOAT, DOUBLE double getdouble() BINARY, VARBINARY byte[] getbytes() DATE java.sql.date getdate() Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 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, " "); // zweiter Param. stmt.executeupdate(); // kein Ergebnis Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 80
47 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; Aufruf der Prozedur über JDBC CallableStatement stmt = con.preparecall( "{call sp_interest(?,?)"); stmt.registeroutparameter(2, Types.FLOAT); stmt.setint(1, accountid); stmt.setfloat(2, ); stmt.execute(); out.println("new Balance: " + stmt.getfloat(2)); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 82
48 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(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 83 2 Java Database Connectivity (JDBC) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 84
49 Client/Server-Programmierung WS 2014/ CORBA 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 86
50 3 CORBA... Literatur CORBA-Spezifikationen der OMG corba spec catalog.htm Farley / Crawford / Flanagan, Kap. 14 Orfali / Harkey, Kap. 1, 4, 7-9, Hofmann / Jobst / Schabenberger, Kap. 2.2, 5, 6 Michi Henning, Steve Vinoski: Advanced CORBA Programming with C++. Addison-Wesley, Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 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, ORBACUS, Java IDL (Teil des JDK), JacORB, ORBit (GNOME!)... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 88
51 3.2 CORBA Architektur 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) Object Management Architecture (OMA)... Das OMA Referenzmodell Application Vertical CORBA Horizontal CORBA Objects Facilities Facilities Client Server Object Request Broker Naming Event... LifeCycle Transactions CORBA Services Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 90
52 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übergreifenden Diensten z.b. Drucken, verteilte Dokumente,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 92
53 3.2 CORBA Architektur 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 94
54 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (3/15) 95 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) iv
55 3.2.2 Common Object Request Broker Arch.... Modell des Object Request Brokers Client Object Implementation Stub Dynamic Invocation Interface ORB Interface ORB Core Skeleton Dynamic Skeleton Interface Object Adapter Interface Repository Implementation Repository Identische Schnittstelle für alle ORB Implementierungen Eine Schnittstelle pro Objekt Typ Mehrere (unterschiedliche) Objekt Adapter möglich ORB spezifische Schnittstelle mögliche Rechnergrenze Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 97
56 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 99
57 3.2 CORBA Architektur 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 101
58 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 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 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 103
59 3.3 Hello World mit CORBA... Vorgehen zur Erstellung der Anwendung 5 Java Interfaces IDL zu Java Compiler Client Stubs Client Hilfs Klassen Server Java Interfaces IDL zu Java Compiler 6 javac 7 4 Client javac Objekt 3 Code Compiler Compiler Impl.code Client Anwendung Stub Schnittstellen definitionen in IDL Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) Object Request Broker Objekt Skeletons POA Objekt Implementierung Skeleton POA 2 Hilfs Klassen 3.3 Hello World mit CORBA... IDL-Beschreibung der Schnittstelle module HelloWorld Paketname { interface Hello Schnittstelle { string sayhello(in string name); ; ; Eingabeparameter Methode CORBA definiert eigene, C++/Java-ähnliche Sprache IDL-Compiler erzeugt Schnittstellen für jeweilige Implementierungssprache kann für Client und Server verschieden sein Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 105
60 3.3 Hello World mit CORBA... Vom IDL-Compiler generierte Dateien Hello.idl Client _HelloStub.java Client Stub Schnittstelle Hilfsfunktionen für Client/Server idlj idl (Java IDL) (JacOrb) Hello.java HelloOperations.java HelloHelper.java HelloHolder.java HelloPOA.java Server POA (Basisklasse) HelloPOATie.java POA (Tie Klasse) Hilfsklasse für Ausgabeparameter Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 107
61 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 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; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 109
62 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.*; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 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(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 111
63 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..."); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) Hello World mit CORBA... // Starte ORB orb.run(); catch(exception e) { System.err.println("ERROR: " + e); e.printstacktrace(system.out); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 113
64 3.3 Hello World mit CORBA... Client-Programm import HelloWorld.*; // Client Stubs import org.omg.cosnaming.*; // Namensdienst import org.omg.corba.*; // 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"); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 115
65 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) Hello World mit CORBA... Starten der Anwendung (Java IDL) Starten des ORB-Daemons (Namensdienst) orbd -ORBInitialPort [ -port <port> ] startet Daemon auf Port (-port legt Port für Objektaktivierung fest) Achtung: ~/orb.properties von JacORB darf nicht existieren! Starten des Servers java HelloServer -ORBInitialPort [ -ORBInitialHost <addr> ] Angabe von Host und Port des ORB-Daemons Starten des Clients java HelloClient -ORBInitialPort [ -ORBInitialHost <addr> ] Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 117
66 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 118 Anmerkungen zu Folie 118: Für die Benutzung von Java IDL muss ggf. der Pfad zum JDK gesetzt werden. Auf den PCs im Labor H-A 4111 ist dieser Pfad: /usr/lib64/jvm/java openjdk/bin/ 118-1
67 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) CORBA im Detail 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; ;... ; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 120
68 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 122
69 3.4.1 OMG IDL und Java-Mapping... Wichtige Basis-Datentypen und ihre Java-Entsprechungen IDL Datentyp Beschreibung Java Datentyp [unsigned] short Ganzzahl, 16 Bit short [unsigned] long Ganzzahl, 32 Bit int [unsigned] long long Ganzzahl, 64 Bit long float Gleitkomma, 32 Bit float double Gleitkomma, 64 Bit double char Zeichen, 8 Bit char string Zeichenkette String boolean (TRUE, FALSE) Boole scher Wert boolean (true, false) octet Byte byte any beliebiger Typ org.omg.corba.any Betriebssysteme / verteilte Systeme Client/Server-Programmierung (4/15) 123 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) v
70 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); ; ; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) OMG IDL und Java-Mapping... Vom IDL-Compiler erzeugte Klassen und Interfaces Beispiel <<interface>> Test1Operations setname() getxy() encrypt() <<interface>> Test1 Test1Helper narrow() insert() extract() Test1Holder _Test1Stub <<interface>> Test2Operations chartostring() <<interface>> Test2 Test2Helper narrow() insert() extract() Test2Holder _Test2Stub Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 125
71 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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;... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 127
72 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 129
73 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 131
74 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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; ; 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; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 133
75 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; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 135
76 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 (); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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"; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 137
77 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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: interface Animal { attribute short age; void eat(in string what); ; interface Dog : Animal { string bark(); ; Umsetzung in Java: AnimalOperations short age() void age(short) void eat(string) Animal DogOperations String bark() Dog Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 139
78 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 141
79 3.4 CORBA im Detail Name Service Der CORBA Namensdienst definiert einen hierarchischen Namensraum Resorts Mexico Greece Hawaii Hyatt Ixtapa Cancun Club Med Playa Blanca Naming Context Object Name Aufbau eines Namens: Resorts Context Name Mexico Club Med Context Name Context Name Cancun Simple Name Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 143
80 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")) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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)); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 145
81 3.4 CORBA im Detail 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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); ; ; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 147
82 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()); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 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(...) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (5/15) 149
83 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) vi 3.4 CORBA im Detail 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) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 150
84 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 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(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 152
85 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(); ; ; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) Delegation und Tie-Klassen... Beispiel: Vererbung der Implementierung... Klassendiagramm der Implementierung: HelloOperations String myname() String sayhello(string) HelloTooOperations String sayhellotoo() HelloPOA Hello HelloToo HelloTooPOA HelloPOATie HelloImpl _delegate HelloTooImpl _delegate HelloTooPOATie Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 154
86 3.4 CORBA im Detail 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) Statische und dynamische Aufrufe... Dynamic Skeleton Interface (DSI): ermöglicht Objekt-Implementierungen, die zur Übersetzungszeit 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 156
87 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(); // Ergebnis extrahieren Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) CORBA im Detail 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,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 158
88 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 160
89 3.4.6 Portable Object Adapter (POA)... POA-Architektur Root Servant POA Active Object Map Object ID POA Manager Adapter Activator Objektreferenz Servant Zeiger POA A Default Servant Object ID Object ID Object ID POA B Servant Manager Object ID Object ID Adapter Activator POA C Object ID Default Servant Servant Servant Servant Manager Servant Servant Servant Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 162
90 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 164
91 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 166
92 3.4 CORBA im Detail 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 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,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 168
93 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 (standardisiert) Object Key (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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 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: Port: Object key (URL): StandardNS/NameServer POA/_root Object key (hex): 0x E E 53 2F 4E 61 6D D 50 4F 41 2F 5F 72 6F 6F 74 Formatiert mit dem dior-tool des JacORB Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 170
94 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) CORBA im Detail 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 172
95 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) Implementation Repository (IMR)... Beispiel: Automatischer Server-Start Client Objektreferenz IDL:HelloWorld/Hello:1.0 frodo:2133 mypoa:hello1 4 LOCATION_FORWARD [bilbo:1799] 1 sayhello() [mypoa:hello1] 5 7 sayhello() [mypoa:hello1] Reply von sayhello() 2 rsh bilbo java HelloServer Implementation Repository (frodo:2133) Server Tabelle HelloWorld Test mypoa rsh bilbo java HelloServer Print Server (bilbo: 1799) mypoa hello1 6 3 ready [mypoa, bilbo: 1799] bilbo:1799 gandalf: 1234 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 174
96 3.4.8 Implementation Repository (IMR)... Beispiel: Automatischer Server-Start 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) CORBA im Detail 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 176
97 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,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (6/15) 178
98 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) vii 3.4 CORBA im Detail 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 179
99 3 CORBA 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,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 180 Client/Server-Programmierung WS 2014/ RMI / IIOP Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 181
100 4 RMI / IIOP... Inhalt RMI über IIOP Farley, Crawford, Flanagan: S. 88ff, Kap. 7 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 183
101 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 185
102 4 RMI / IIOP... Server-Code import javax.naming.*; import java.rmi.*; import java.util.*; import 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 + "!"; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 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) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 187
103 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) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 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) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 189
104 4 RMI / IIOP... Code-Erzeugung mit RMI-Server / CORBA-Client Client Seite Server Seite _HelloStub.java Hello.java HelloServer.java HelloHolder.java HelloHelper.java Hello.java idlj javac Hello.class HelloServer.class HelloOperations.java HelloClient.java javac HelloClient.class... rmic iiop idl Hello.idl _Hello_Stub.class _HelloServer_Tie.class Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 190 Client/Server-Programmierung WS 2014/ Java Komponenten-Modelle Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 191
105 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 (EJB 2.1!) Sriganseh / Brose / Silverman package-summary.html Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) Java Komponenten-Modelle 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 193
106 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 195
107 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) target.setvalue(val); = x; Verwendung der Komponente in einer Anwendung: Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) Komponenten-Modelle... Werkzeug-Unterstützung (Bsp: Visual Café) Komponenten auswahl Anwendung mit Komponenten Editor für Komponenten Eigenschaften Wizard zur Komponenten Verknüpfung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 197
108 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) Java Komponenten-Modelle 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,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 199
109 5.2 Komponentenmodelle in Java EE... Verteilte Anwendungen mit Java EE Applet Container Applet Java SE Application Client Container Client Standard Services Java SE HTTP /SSL HTTP /SSL RMI/IIOP JDBC Web Container JSP Servlet Standard Services Java SE RMI/ IIOP JDBC EJB Container EJB Standard Services Java SE JDBC Database Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) Java Komponenten-Modelle 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 201
110 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 203
111 5.3 JavaBeans... Black-Box Sicht einer JavaBean Methoden Properties BeanInfo JavaBean Komponente Customizer Ereignisse JAR Archiv (incl..ser Dateien) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 205
112 5.3 JavaBeans... JDK als Komponenten-Framework Für JavaBeans übernimmt JDK die Rolle des Komponenten- Frameworks 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 207
113 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[]) { Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 209
114 5.3 JavaBeans 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 211
115 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (7/15) 212 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) viii
116 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(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 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... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 214
117 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) Ereignisse... Beispiel: Smiley und Button addactionlistener() Toggle Button action Performed() 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(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 216
118 5.3 JavaBeans 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 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 short[] gettabstops(); public short gettabstops(int index); public void settabstops(short[] value); public void settabstops(int index, short value); Alle Methoden sind optional Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 218
119 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 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 PropertyVeto- Exception 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 220
120 5.3 JavaBeans 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) JavaBeans 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 222
121 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 224
122 5.3 JavaBeans 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) Java Komponenten-Modelle 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 226
123 Anmerkungen zu Folie 226: Dieser Abschnitt bezieht sich auf die Version 3.0 der EJB-Spezifikation. Gegenüber der vorherigen Version 2.1 gibt es sehr große Unterschiede! Folien zu EJB 2.1 finden Sie im Skript aus dem Wintersemester 2007/2008: csp/v 4.pdf 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 227
124 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) Enterprise Java Beans (EJB 3.0)... Grundlegende Elemente in einer EJB-Umgebung Anwendungs Methoden Business Interface EJB Container (Transaktionsmanagement Zugriffskontrolle Ressourcen Pooling Persistenz) EJB Client EJB Instanzen (Anwendungs Methoden) Antwort Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 229
125 5.4 Enterprise Java Beans (EJB 3.0)... Das EJB 3.0 Programmiermodell Remote Client (8) (1) Methoden aufruf Remote Sicht Lokale Sicht Business Interface (1) Lokaler Client (2) Aufruf der Methode in der Wrapper Klasse (7) (8) (4) Aufruf der Methode in der Bean Klasse Wrapper Klasse* (5) EJB Container (3) API Aufrufe für Dienste vor Methodenaufruf Container Dienste (6) API Aufrufe für Dienste nach Methodenaufruf EJB Klasse * vom Container generiert i.a. als EJB Objekt bezeichnet Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) Enterprise Java Beans (EJB 3.0) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 231
126 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) Enterprise Java Beans (EJB 3.0) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 233
127 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 235
128 5.4 Enterprise Java Beans (EJB 3.0) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) Einschub: Java Annotationen... Beispiel Definition einer Annotation: import java.lang.annotation.*; // Meta Annotation: Annotation soll auch zur Laufzeit verfügbar // Meta Annotation: Annotation ist auf Klassen und Interfaces // Definition der Annotation CodeCategory { boolean istested(); String[] tester() default {; boolean isreviewed() default false; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 237
129 5.4.3 Einschub: Java Annotationen... Beispiel... Verwendung der = 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()); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 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 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 239
130 5.4 Enterprise Java Beans (EJB 3.0) Beispiel Hello World Remote Business Interface package org.hello; import javax.ejb.remote; // Java Annotation: markiert Schnittstelle als Remote EJB public interface HelloRemote { public String sayhello(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) Beispiel Hello World... EJB-Klasse package org.hello; import javax.ejb.stateless; // Java Annotation: markiert Klasse als Stateless Session public class HelloImpl implements HelloRemote { public String sayhello() { return "Hallo? Jemand da?"; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 241
131 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 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:// :4201"); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 243
132 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) {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (8/15) 244 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) ix
133 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 export PATH=$OPENEJB_HOME/bin:$PATH Start des Containers: openejb start Stoppen des Containers: ^C oder kill Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) Einschub: OpenEJB... Übersetzung / Deployment des Servers Übersetzung javac -cp $OPENEJB_HOME/lib/javaee-api 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 246
134 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 248
135 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 jar:. HelloClient.java Start java -cp $OPENEJB_HOME/lib/javaee-api jar: $OPENEJB_HOME/lib/openejb-client jar:. HelloClient Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) Einschub: OpenEJB... Ablauf des Programms Client Name Service EJB Objekt Container System Class.newInstance() bind() Container lookup() sayhello() Class.newInstance() sayhello() Bean Instanz sayhello() sayhello() Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 250
136 Anmerkungen zu Folie 250: Der Begriff EJB-Objekt stammt eigentlich von EJB 2, er wird aber auch noch für die Wrapper-Objekte (d.h. die Objekte der Wrapper-Klasse, die der Container zur Laufzeit für eine Session-Bean erzeugt) von EJB 3 verwendet, z.b. im Buch von Burke und Monson-Haefel. Der gezeigte Ablauf ist zum Teil spekulativ, da die interne Vorgehensweise des Containers vom EJB-Standard nicht festgelgt und nach außen teilweise auch nicht beobachtbar ist. Das betrifft vor allem die Details der Erzeugung und Registrierung des EJB-Objekts. OpenEJB erzeugt bei einer stateless Session Bean die erste Bean-Instanz aber tatsächlich erst beim ersten Aufruf einer Methode Einschub: OpenEJB... Weitere Informationen OpenEJB Home Page Dokumentation zu OpenEJB Dokumentation zu OpenJPA apache-openjpa-1.1.0/docs/manual/ OpenJPA ist der Standard Persistence Provider von OpenEJB für Entities EJB 3.0 Spezifikationen jsr220/ Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 251
137 5.4 Enterprise Java Beans (EJB 3.0) 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 Datenbank- Verbindungen 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 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 ( ) Methoden von Session Beans können automatisch als Transaktionen ausgeführt werden Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 253
138 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) Enterprise Java Beans (EJB 3.0) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 255
139 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 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... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 257
140 5.4.7 Der Deployment-Deskriptor ejb-jar.xml... Elemente innerhalb von <assembly-descriptor> <container-transaction> Transaktions-Attribute für einzelne Methoden ( ) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 259
141 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 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 Konfigurationswerkzeug erstellt Rollen und Zugriffsrechte können auch über Annotationen festgelegt werden Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 261
142 5.4 Enterprise Java Beans (EJB 3.0) 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 Stateful Session Beans Erzeugung / Löschung (indirekt) auf Veranlassung des Clients Bean-Instanzen werden Client- Sitzungen (und damit EJB- Objekten) fest zugeordnet Aufrufe eines Clients gehen an dieselbe Bean-Instanz bei Bedarf: Passivierung / Aktivierung durch Container Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) Session Beans: Details... Annotationen für Schnittstellen und (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 (aus javax.ejb) markieren eine Java-Klasse als entsprechende Session (aus javax.ejb) markiert eine Methode in einer (stateful) Session Bean- Klasse, nach deren Ausführung die Bean-Instanz gelöscht werden soll Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 263
143 5.4.8 Session Beans: Details... Beispiel public interface RemIf { public String sayhello(); public void bye(); public interface LocIf { public String sayhello(); public void doit(); public class MyBean implements LocIf, RemIf { public String sayhello() public void bye() {... public void doit() {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) Session Beans: Details... (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 (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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 265
144 5.4.8 Session Beans: Details... (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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 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 (aus javax.annotation) für beliebige Resourcen des Containers z.b. SessionContext: erlaubt Zugriff auf Benutzer-Name, aktuelle (aus javax.ejb) speziell, um Referenzen auf EJBs zu holen (Alternative: explizite Nutzung von JNDI) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 267
145 5.4.8 Session Beans: Details... Beispiel public interface MyBeanLocal { public String getname(); public class MyBean implements MyBeanLocal { // Attribut wird vom Container private SessionContext context; public String getname() { return context.getcallerprincipal().getname(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) Session Beans: Details... Beispiel... public interface HelloRemote { public String sayhello(); public String saygoodbye(); public class HelloImpl implements HelloRemote { // Referenz auf MyBean wird vom Container private MyBeanLocal mybean; public String sayhello() { return "Hallo " + public String saygoodbye() {... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 269
146 5.4.8 Session Beans: Details... Beispiel... public void start() { System.out.println("@PostConstruct public void stop() { System.out.println("@PreDestroy public Object inv(invocationcontext c) throws Exception { System.out.println("HelloImpl: Calling " + c.getmethod().getname()); return c.proceed(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) Session Beans: Details... Lebenszyklus einer Stateless Session Bean Container entscheidet, daß mehr Bean Instanzen im Pool benötigt werden, um Clients zu bedienen Bean Instanz existiert nicht Container entscheidet, daß nicht mehr so viele Bean Instanzen benötigt werden Beliebiger Client ruft Anwendungs methode auf. Abar beitung in beliebiger EBJ. 1. Class.newInstance() 2. Injections Anwendungs Pool äquivalenter Instanzen, bereit für Methodenaufrufe Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 271
147 5.4.8 Session Beans: Details... Typische Abläufe bei Stateless Session Beans Client Hinzufügen einer neuen Instanz zum Pool EJB Objekt Container System Container Class.newInstance() Bean Instanz Methodenaufrufe durch Client businessmethod() businessmethod() Löschen einer Instanz aus dem Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) Session Beans: Details... Lebenszyklus einer Stateful Session Bean Client holt/nutzt Referenz auf ein Interface der Session Bean Bean Instanz existiert nicht Client ruft Methode auf, die annotiert ist oder: Timeout 1. Class.newInstance() 2. Timeout Anwendungs Passiv Client ruft Anwendungs methode der Session Bean Limit instantiierter Beans ist erreicht. Container muß Bean auslagern Client ruft Methode der passivierten Bean. Container muß Bean wieder einlagern Betriebssysteme / verteilte Systeme Client/Server-Programmierung (9/15) 273
148 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) x Session Beans: Details... Erzeugung/Löschung einer Stateful Session Bean Client lookup() Erzeugung EJB Objekt Löschung Name Service Container businessmethod() Container System Class. businessmethod2() EJB Objekt Class.newInstance() businessmethod() PreDestroy Bean Instanz Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 274
149 5.4.8 Session Beans: Details... Passivierung/Aktivierung einer Stateful Session Bean Client EJB Objekt Container Bean Inst. Festplatte Passivierung Container serialisiere Bean Instanz speichere Zustand ab businessmethod() Aktivierung Class.newInstance() Bean Inst. Lies Zustand ein deserialisiere Bean businessmethod() Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) Enterprise Java Beans (EJB 3.0) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 276
150 5.4.9 Entities: Details... Beispiel Entity Account.java: import // Markiert Klasse als Entity public class Account implements java.io.serializable // 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; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) Entities: Details... Beispiel... Deployment-Deskriptor META-INF/persistence.xml: <persistence xmlns=" 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 278
151 Anmerkungen zu Folie 278: Das Tag jta-data-source definiert die Datenquelle, die verwendet werden soll, wenn der Container selbst das Management der Entities übernimmt. Alternativ kann man auch eigene Entity Manager erzeugen. Dann wird die Datenquelle verwendet, die als non-jta-data-source definiert ist. Die Property openjpa.jdbc.synchronizemappings legt fest, daß OpenJPA das Datenbank-Schema zur Laufzeit an das in den Entities vorgegebene Mapping anpassen soll. Siehe docs/manual/ref guide mapping.html 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 279
152 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) Entities: Details... Anmerkungen zum Beispiel... Beispiel verwendet Field Access Persistence Provider greift direkt auf die Attribute zu Mapping-Annotationen 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 281
153 Anmerkungen zu Folie 281: Bei Field Access greift der Persistence Provider über Java Reflection auf die Attribute zu, auch wenn diese nicht public sind. Tatsächlich dürfen sie nicht public sein. Vererbung ist bei Entity-Klasse möglich. Im einfachsten Fall gibt es dabei eine Datenbanktabelle für alle Unterklassen, wobei der Wert in einer Spalte festlegt, um welche Unterklasse es sich bei einem Eintrag handelt 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, ) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 282
154 5.4.9 Entities: Details... Beispiel zur Nutzung der Entity in einer Session Bean Remote-Schnittstelle BankRemote.java: import public interface BankRemote { public Account create(int n, String name); public String getname(int n); public void close(int n); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) Entities: Details... Beispiel zur Nutzung der Entity in einer Session Bean... Bean-Implementierung BankImpl.java: import javax.ejb.*; import public class BankImpl implements BankRemote { // Dependency Injection: Entity Manager für Persistenz Einheit 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 284
155 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 286
156 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) Entities: Details... Lebenszyklus einer Entity new new refresh() persist() remove() managed persist() Persistence Context merge() endet removed Instanz wird mit Daten bank konsistent gehalten detached Instanz hat Datenbank Eintrag, ist aber nicht mit Persistence Context verbunden (z.b. Kopie einer managed Entity) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 288
157 5.4.9 Entities: Details... Lebenszyklus einer Entity... Persistence Context endet per Voreinstellung mit dem Ende der aktuellen Transaktion Einstellung über Attribut type 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 Lebenszyklus-Callbacks analog zu Session Beans möglich Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 289 Anmerkungen zu Folie 289: Wenn der Persistence Context endet, bedeutet das, daß alle Entities in den detached- Zustand gehen, also nicht mehr mit der Datenbank synchronisiert werden. Für die Programmierung heißt das, daß zu Beginn jeder Transaktion (d.h. i.a. zu Beginn jeder Methode der Session Bean), die Entities per find-methode neu aus der Datenbank geholt werden müssen. Um das zu vermeiden, kann man eine stateful Session Bean verwenden, die den Persistence Context mit dem zusätzlichen Attribut type=persistencecontexttype.extended in der Annotation definiert
158 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 der Entity als named-query Element im Deskriptor META-INF/orm.xml Nutzung: query = manager.createnamedquery("myquery"); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 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), Tabellenname für Spaltenname für Attribut wird nicht persistent gemacht Auch Abbildung von Assoziationen zwischen Klassen durch entsprechende Annotationen @JoinColumn, siehe Beispiel Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 291
159 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: Account accountno: int name: String 1 payments * Payment id: int date: Date amount: double Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) Entities: Details... Beispiel zum OR-Mapping... public class private int accountno; private String 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);... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 293
160 5.4.9 Entities: Details... Beispiel zum OR-Mapping... public class Payment private nullable=false) private Account private Date private double amount;... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) Entities: Details... Anmerkungen zum Beispiel Bedeutung des Parameters type 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 realisiert eine bidirektionale 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (10/15) 295
161 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) xi 5.4 Enterprise Java Beans (EJB 3.0) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 296
162 Transaktionen... Arten des Transaktions-Managements Festlegung durch Annotation der Session (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 (aus javax.ejb) Client Initiated Transactions Transaktionsgrenzen werden vom Client bestimmt Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 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 private UserTransaction ut; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 298
163 Transaktionen... Container Managed Transactions: Beispiel Ticket-Buchung public class TravelAgentBean implements TravelAgentRemote 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 300
164 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 302
165 Transaktionen... Container Managed Transactions: Transaktionsattribute... Transaktions Attribut NOT_SUPPORTED SUPPORTS REQUIRED REQUIRES_NEW MANDATORY NEVER 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) Enterprise Java Beans (EJB 3.0) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 304
166 Client/Server-Programmierung WS 2014/ Servlets und JSP Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 306
167 6 Servlets und JSP 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 Web Browser HTML Seite Servlet Servlet Datenbank Web Server Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) Servlets 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 308
168 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 310
169 6.1 Servlets 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 export CATALINA_HOME=/opt/dist/apache-tomcat export PATH=$CATALINA_HOME/bin:$PATH Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 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 Im Labor H-A 4111 muß wegen des voreingestellten Web- Proxies immer der vollständige Rechnername (FQDN) angegeben werden z.b. bsclk01.lab.bvs Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 312
170 6.1 Servlets 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++; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 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(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 314
171 6.1.3 Beispiel: Hello-World Servlet... HTML-Seite zum Aufruf des Servlets <HTML> <HEAD><TITLE>Hello-World</TITLE></HEAD> <BODY> <P> <A HREF=" Say Hello to Roland</A> </P> <P> Say Hello to: <FORM METHOD="GET" ACTION=" <INPUT TYPE="text" NAME="name" SIZE="10"> <INPUT TYPE="submit" VALUE="Submit"> </FORM> </P> </BODY> </HTML> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 316
172 6.1.3 Beispiel: Hello-World Servlet... Deployment-Deskriptor für das Servlet <?xml version="1.0" encoding="iso "?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" " <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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) Beispiel: Hello-World Servlet... Deployment mit Tomcat-Server... Servlet ist nun unter dieser URL ansprechbar: HTML-Datei zum Aufruf des Servlets kann z.b. nach $CATALINA_BASE/webapps/ROOT/hello.html kopiert werden URL dann Anmerkungen: Servlet-Klassen dürfen nicht im CLASSPATH von Tomcat sein! Tomcat nie im Verzeichnis starten, in dem die Servlet- Klassen liegen! Tomcat 6.0 kann beim Deployment auch laufen WAR Archiv wird bei Änderung erneut ausgepackt, Klassen werden neu geladen Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 318
173 6.1 Servlets 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() Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) Servlets 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 320
174 6.1 Servlets 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 322
175 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>"); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 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(); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 324
176 6 Servlets und JSP 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (11/15) 325 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) xii
177 6.2 Java Server Pages (JSP) Spezielle Tags für JSP Tag für Ausdrücke: <%= Ausdruck %> Wert des Java-Ausdrucks erscheint in HTML-Ausgabe Beispiel: <html><body> = <%= 17+4 %> </body></html> Ergebnis: <html><body> = 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 327
178 6.2.1 Spezielle Tags für JSP... Tag zur Deklaration globaler Variablen: <%! Deklaration %> globale Variable = 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) Java Server Pages (JSP) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 329
179 6.2 Java Server Pages (JSP) 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 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; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 331
180 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) Java Server Pages (JSP) 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 333
181 6.2 Java Server Pages (JSP) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) Servlets und JSP 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 335
182 Client/Server-Programmierung WS 2014/ Web Services Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) Web Services... Inhalt Einführung Web-Service-Standards XML, SOAP, WSDL, UDDI Web Services mit Axis2 Sicherheit von Web Services Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 337
183 7 Web Services... Literatur Hammerschall, Kap. 7 Langner: Web Services mit Java Hein, Zeller: Java Web Services A. Eberhart, S. Fischer: Web Services, Hanser, M. P. Papagoglou: Web Servces: Principles and Technology, Pearson, T. Frotscher, M. Teufel, D. Wang: Java Web Services mit Apache Axis2, Entwickler.press, 2007 Zu XML auch: Horstmann / Cornell, Kap. 12 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) Web Services 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 Client Anwendung Internet Reise Service Web Service Web Service Internet Hotel Service Autobuchungs Service Web Service Flugbuchungs Service Web Service Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 339
184 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 XML- Dokumenten I.a. synchrone Kommunikation mit Anfrage/Antwort-Muster aber auch allgemeinere Kommunikationsmuster möglich Anfragen ohne Antwort, Ereignismeldungen,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 341
185 7 Web Services 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) Web-Service-Standards 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 Nutzinformation 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 343
186 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></name> </mail-address> </addressbook> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 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>...< > </name>...</ > 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 --> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 345
187 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 -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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 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=" <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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 347
188 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?) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) XML (Extensible Markup Language)... Beispiel: XML Schema für das Adressbuch AddressBookType be Root Element Namensraum steht aus 0 oder mehr <mail address> Elementen <? xml version="1.0" encoding="utf 8"?> <xsd:schema xmlns:xsd=" <xsd:element name="addressbook" type="addressbooktype"/> <xsd:complextype name="addressbooktype"> <xsd:element name="mail address" minoccurs="0" maxoccurs="unbounded"> <xsd:complextype name="mailaddresstype"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name=" " type="xsd:string" maxoccurs="unbounded"/> </xsd:sequence> <mail address> enthält erst ein <name> Element und dann ein oder mehr < > Elemente Die Elemente <name> und < > enthalten Text Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 349
189 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 name="category" type="categorytype" use="optional"/> </xsd:complextype> </xsd:element> </xsd:complextype> <xsd:simpletype name="categorytype" base="xsd:string"> <xsd:enumeration value="professor"/> <xsd:enumeration value="assistant"/> </xsd:simpletype> CategoryType ist ein </xsd:schema> String, der nur die Werte "professor" oder "assistant" haben kann Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) XML (Extensible Markup Language)... Beispiele für XML-Dokumente (nur Rumpf) Gültig: <addressbook> <mail address> <name>hugo</name> < >[email protected]</ > </mail address> <mail address category="assistant"> <name>fritz</name> < >fr@home</ > < >hallo</ > </mail address> </addressbook> Ungültig: <addressbook> <mail address> < >[email protected]</ > <name>hugo</name> </mail address> <mail address category="assistant"> <name>fritz</name> </mail address> <name>hans</name> </addressbook> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 351
190 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) Web-Service-Standards 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 353
191 7.2.2 SOAP... Das SOAP-Nachrichtenformat <?xml version="1.0"?> SOAP Envelope <env:envelope xmlns:env=" envelope"> <env:header> </env:header> SOAP Header Header Block (anwendungsspezifisch) Header Block (anwendungsspezifisch) <env:body> SOAP Body Nachrichten Rumpf (anwendungsspezifisch) </env:body> </env:envelope> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 355
192 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 357
193 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 WSDL- Dokument festgelegt Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 359
194 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 void Ausgabeparameter der Operation (mit Namen) zum Melden von Fehlern: spezielles <fault>-element Unterelemente für Fehlercode und -beschreibung Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 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=" xmlns:xsd=" xmlns:xsi=" <env:body> <ns1:reserviere env:encodingstyle=" xmlns:ns1=" <flugnr xsi:type="xsd:string">wa417</flugnr> <sitze xsi:type="xsd:int">3</sitze> <datum xsi:type="xsd:datetime"> </datum> </ns1:reserviere> </env:body> </env:envelope> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 361
195 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (12/15) 362 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) xiii
196 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=" <soapenv:body> <reserviere xmlns=" <flugnr>wa417</flugnr> <sitze>3</sitze> <datum> </datum> </reserviere> </soapenv:body> </soapenv:envelope> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) SOAP... Beispiel einer SOAP-Nachricht (document/literal/wrapped)... Antwortnachricht <?xml version= 1.0 encoding= UTF-8?> <soapenv:envelope xmlns:soapenv=" <soapenv:body> <reserviereresponse xmlns=" <return>ghftr89</return> </reserviereresponse> </soapenv:body> </soapenv:envelope> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 364
197 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 Seiteneffekte und ohne SOAP-Header Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) Web-Service-Standards WSDL XML-basierte Sprache zur Beschreibung von Diensten also u.a. Schnittstellen-Beschreibungssprache zusätzlich aber auch: Ort (URL) des Dienstes und zu verwendendes Protokoll Eigenschaften von WSDL unabhängig von Programmiermodell, Implementierungssprachen 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 366
198 7.2.3 WSDL... Aufbau eines WSDL-Dokuments <?xml version="1.0"?> <wsdl:definitions targetnamespace=" air.de/buchung/"... xmlns:wsdl=" Spezifikation von Datentypen Wurzelelement Beschreibung der Nachrichtenformate (WSDL 1.1) Beschreibung der Schnittstellen Beschreibung der Bindungen Beschreibung des Dienstes </wsdl:definitions> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 368
199 7.2.3 WSDL... Beispiel zur allgemeinen Struktur eines Dienstes Dienst Endpunkt mit URI 1 (SOAP) Endpunkt mit URI 2 (HTTP GET) Endpunkt mit URI 3 (HTTP POST) Endpunkt mit URI 4 (SOAP) Endpunkt mit URI 5 (HTTP GET) Schnittstelle 1 Operation 1 Operation 2 Operation 3 Schnittstelle 2 Operation 4 Operation 5 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 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=" <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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 370
200 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 372
201 Anmerkungen zu Folie 372: Bei WSDL 2.0 haben die input und output Elemente anstelle des Attributs message ein Attribut element, das auf das Element des XML-Schemas (unter types) verweist, das den Datentyp beschreibt 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. action- Attribut im HTTP-Header übernommen wichtig bei document, vgl. Folie 362 Codierung der Ein- und Ausgabe (encoded oder literal) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 373
202 7.2.3 WSDL... Beschreibung der Bindungen... Beispiel (ohne Namensraumangabe für WSDL-Elemente): <binding name="buchungsoapbinding" type="ns:buchungporttype"> <soap:binding transport= " style="document" /> <operation name="reserviere"> <soap:operation soapaction="urn:reserviere" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 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=" /> </port> </service> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 375
203 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=" xmlns:ns=" xmlns:wsdl=" xmlns:http=" xmlns:soap=" xmlns:mime=" xmlns:soap12=" targetnamespace=" Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) WSDL... <wsdl:types> <xs:schema xmlns:xs=" attributeformdefault="qualified" elementformdefault="qualified" targetnamespace=" <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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 377
204 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=" wsaw:action="urn:getit" message="axis2:getitmessage"/> <wsdl:output xmlns:wsaw=" message="axis2:getitresponsemessage" wsaw:action="urn:getit"/> </wsdl:operation> <wsdl:operation name="putit"> <wsdl:input xmlns:wsaw=" wsaw:action="urn:putit" message="axis2:putitmessage"/> </wsdl:operation> </wsdl:porttype> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) WSDL... <wsdl:binding name="testsoap11binding" type="axis2:testporttype"> <soap:binding transport=" 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 379
205 7.2.3 WSDL... <wsdl:binding name="testsoap12binding" type="axis2:testporttype"> <soap12:binding transport=" style="document" />... </wsdl:operation> </wsdl:binding> <wsdl:service name="test"> <wsdl:port name="testsoap11port" binding="axis2:testsoap11binding"> <soap:address location=" /> </wsdl:port> <wsdl:port name="testsoap12port" binding="axis2:testsoap12binding"> <soap12:address location=" /> </wsdl:port> </wsdl:service> </wsdl:definitions> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) Web-Service-Standards 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 381
206 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) Web Services Web-Services und EJB Eine stateless Session Bean kann durch einfache Annotation zu einem Web-Service public class HelloImpl implements HelloRemote public String sayhello() { return "Hallo? Jemand da?"; WSDL-Datei bei OpenEJB dann unter folgender URL verfügbar: Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 383
207 7 Web Services 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) Web Services mit Axis 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 385
208 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: enthält u.a. Links zu Validierungsseite und Liste deployter Web Services Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) Web Services mit Axis 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 -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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 387
209 7.4.2 Beispiel: Hello-World mit Axis2... Schritte zur Erstellung des Web Services 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: sayhello?args0=roland Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) Beispiel: Hello-World mit Axis2... Schritte zur Erstellung des Clients 1. Erstellung einer Java-Schnittstelle für den aufzurufenden Web Service: wsdl2java.sh -uri -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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 389
210 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 + ")"; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (13/15) 391
211 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) xiv 7.4 Web Services mit Axis 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 392
212 7.4.3 Details zu den Axis2-Werkzeugen... java2wsdl.sh: Beispiel public interface HelloWorld { public String sayhello (String name); java2wsdl.sh cn HelloWorld l <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=" Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 394
213 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) Details zu den Axis2-Werkzeugen... Konstruktoren der Klasse Service Stub ServiceStub() 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 396
214 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 398
215 7.4.3 Details zu den Axis2-Werkzeugen... Service-Deskriptor <servicegroup> <service name="helloworld"> <messagereceivers> <messagereceiver mep=" class="hello.helloworldmessagereceiverinout"/> </messagereceivers> <parameter name="serviceclass">hello.helloworldskeleton</parameter <parameter name="useoriginalwsdl">true</parameter> <parameter name="modifyuserwsdlportaddress">true</parameter> <operation name="sayhello" mep=" namespace=" <actionmapping>urn:sayhello</actionmapping> <outputactionmapping>urn:sayhelloresponse</outputactionmapping </operation> </service> </servicegroup> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 400
216 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/ 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>... Server Tomcat Web Server dopost() Axis2 Servlet sayhello() <?xml version <soapenv:env <sayhello...>... <?xml version <soapenv:env <sayhellores... "Roland" HelloWorld "Hello to Roland" Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) Web Services mit Axis 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 402
217 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 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">... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 404
218 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 406
219 7.4.4 Sitzungs-Management mit Axis2... Ablauf der Kommunikation im Beispiel Client 1 2 POST /axis2/services/helloworld HTTP/ <?xml... HTTP/ OK... Set Cookie: JSESSIONID=66CFAB...; Path=/axis2... <?xml... POST /axis2/services/helloworld HTTP/ Cookie: JSESSIONID=66CFAB...; Path=/axis2 <?xml... HTTP/ OK... <?xml... Server Tomcat Web Server dopost() Axis2 Servlet HelloWorld HelloWorld HelloWorld Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 408
220 7.4.4 Sitzungs-Management mit Axis2... Ablauf der Kommunikation im Beispiel Client 1 2 POST /axis2/services/helloworld HTTP/ <?xml... HTTP/ OK... <?xml...><envelope...><header...> <wsa:replyto>...<wsa:referenceparameters> <axis2:servicegroupid...>urn:uuid:4de POST /axis2/services/helloworld HTTP/ <?xml...><envelope...><header...> <axis2:servicegroupid...>urn:uuid:4de HTTP/ OK... <?xml...><envelope...><header...> <wsa:replyto>...<wsa:referenceparameters> <axis2:servicegroupid...>urn:uuid:4de Server Tomcat Web Server dopost() Axis2 Servlet HelloWorld HelloWorld HelloWorld Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) Web Services mit Axis 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 410
221 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 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) Axis2 Module... Nachrichtenverarbeitung in Axis2 Client Client API Out Pipe Handler Transport Sender SOAP Transport Listener In Pipe Handler Message Receiver Web Service 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 412
222 Anmerkungen zu Folie 412: Siehe Axis2 Dokumentation: docs/axis2architectureguide.html#bmsoappm 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 413
223 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; Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 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"/>... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 415
224 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=" <module ref="logger"/>... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 416 Anmerkungen zu Folie 416: Das Engagement eines Handlers im Client erfolgt folgendermaßen: Kopieren des Archivs (im Beispiel logger.mar) in das Verzeichnis $AXIS2 HOME/repository/modules ggf. in der Konfigurationsdatei $AXIS2 HOME/conf/axis2.xml die entsprechende Phase einrichten Client-Code (im Beispiel) um folgende Anweisung ergänzen: stub. getserviceclient().engagemodule("logger"); Das Deployment-Verzeichnis und die Konfigurationsdatei sind dabei ggf. verschieden von denen des Axis2-Servlets
225 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... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) Web Services 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 418
226 7.5 Web Services und Sicherheit 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 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 erreichbar Betriebssysteme / verteilte Systeme Client/Server-Programmierung (14/15) 420
227 Client/Server-Programmierung WS 2014/ Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/ , Büro: H-B 8404 Stand: 23. Januar 2015 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) xv 7.5 Web Services und Sicherheit 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 421
228 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); Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) Web Services und Sicherheit 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 SOAP- Nachricht 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 423
229 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üsselungsalgorithmus, Schlüsselinformation, Chiffretext SOAP-Header enthält Referenzen auf alle verschlüsselten Teile des Body Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) Nutzung der WS Security Paradigmen... Beispiel für eine verschlüsselte SOAP-Nachricht <env:envelope xmlns:env=" xmlns:wsse=" open.org/wss/2004/01/oasis wss wssecurity secext 1.0.xsd" xmlns:ds=" xmlns:xenc=" <env:header> <wsse:security> <xenc:referencelist> <xenc:datareference URI="#bodyID"/> </xenc:referencelist> </wsse:security> </env:header> <env:body> <xenc:encrypteddata Id="bodyID"> Security Header Block zeigt an, daß Inhalt des SOAP Bodies verschlüsselt ist Verschlüsselter Element Inhalt <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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 425
230 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) Nutzung der WS Security Paradigmen... Beispiel für eine signierte SOAP-Nachricht <env:envelope...> <env:header> <wsse:security> <wsse:binarysecuritytoken ValueType="...#X509v3" EncodingType="...#Base64Binary" wsu:id="x509token"> MIIEZzCCA9CgAwIBA... </wsse:binarysecuritytoken> <ds:signature> <ds:signedinfo> X509 Zertifikat, binär, Base64 codiert <ds:canonicalizationmethod Algorithm="..."/> <ds:signaturemethod Algorithm= ".../xmldsig#rsa sha1"/> <ds:reference URI="#myBody"> Referenz auf signiertes <ds:transforms> Element <ds:transform Algorithm="..."/> </ds:transforms> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 427
231 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> Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 428 Anmerkungen zu Folie 428: Das Element CanonicalizationMethod spezifiziert einen Algorithmus, der verwendet wird um das XML-Dokument vor der Signatur in eine kanonische Form zu bringen (z.b. Umwandlung in UTF-8, Umwandlung von CR/LF in LF etc.). Das Transforms-Element kann zusätliche eine Liste beliebiger zusätzlicher Transformationen beschreiben, die vor der Signatur angewandt werden, z.b. Base64 Encoding, XPath Filterung, Anwendung von XSLT,
232 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) Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) Web Services 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,... Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 430
233 Client/Server-Programmierung WS 2014/ Weitere Client/Server-Technologien Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) Weitere Client/Server-Technologien Technologien zur Netzwerkprogrammierung Sockets: plattform- und netzwerkunabhängiges Kommunikations- API (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, T. Langner: Verteilte Anwendungen mit Java, Markt + Technik, Kap. 3 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 432
234 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, 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) Weitere Client/Server-Technologien 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 434
235 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: 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: Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) Weitere Client/Server-Technologien 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 436
236 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 438
237 8.3 Microsoft.Net und DCOM... COM / DCOM (Distributed Component Object Model)... Aufbau einer COM-Schnittstelle: Client Schnittstellen Zeiger COM Objekt Interner Zeiger auf Methoden Tabelle Zeiger auf Methode 1 Zeiger auf Methode 2 QueryInterface() {... AddRef() {... Release() {... "geerbt" von IUnknown Zeiger auf Methode 3 Zeiger auf Methode 4 sayhello() {... Zeiger auf Methode 5 saygoodby() {... Methoden Tabelle Methoden Code Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 440
238 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) Schnittstelle, nicht auf ein Objekt Client kann sich nicht mit bestimmter Instanz einer Komponente 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 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) Microsoft.Net und DCOM... Containment/Delegation und Aggregation Containment/Delegation: Aggregation: IUnknown IUnknown A Äußeres Objekt A 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. QueryInterface() gibt Schnittstel le A des äußeren und Schnitt stellen B und C der inneren Objekte zurück. Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 442
239 8.3 Microsoft.Net und DCOM... Literatur: Hammerschall, Kap. 10 Orfali / Harkey, Kap. 15 Hofmann / Jobst / Schabenberger, Kap. 3 und 4 Betriebssysteme / verteilte Systeme Client/Server-Programmierung (15/15) 443
Client/Server-Programmierung
Client/Server-Programmierung WS 2014/2015 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 20. November 2015 Betriebssysteme / verteilte
Client/Server-Programmierung
Client/Server-Programmierung WS 2014/2015 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 21. Oktober 2014 Betriebssysteme / verteilte
Client/Server-Programmierung
Client/Server-Programmierung WS 2014/2015 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 20. November 2015 Betriebssysteme / verteilte
Client/Server-Programmierung
Client/Server-Programmierung WS 2014/2015 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 15. Oktober 2015 Betriebssysteme / verteilte
Client/Server-Programmierung
Client/Server-Programmierung WS 2014/2015 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 15. Oktober 2015 Betriebssysteme / verteilte
Client/Server-Programmierung
Client/Server-Programmierung WS 2016/2017 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 18. November 2016 Betriebssysteme / verteilte
Client/Server-Programmierung. CORBA: Schritt-für-Schritt Anleitung (Mini HOWTO)
Client/Server-Programmierung WS 2007/08 CORBA: Schritt-für-Schritt Anleitung (Mini HOWTO) Version 1.2, 28.11.07 Schritt 1: Erstellung der IDL Zuerst muß eine IDL (Interface Definition Language)-Datei erstellt
Client/Server-Programmierung
Client/Server-Programmierung WS 2017/2018 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 15. Dezember 2017 Betriebssysteme / verteilte
Verteilte Systeme. SoSe Universität Siegen Tel.: 0271/ , Büro: H-B Stand: 11.
Verteilte Systeme SoSe 2018 Universität Siegen [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 11. April 2018 Betriebssysteme / verteilte Systeme Verteilte Systeme (1/14)
Java Database Connectivity (JDBC) 14.07.2009 Walther Rathenau Gewerbeschule 1
Java Database Connectivity (JDBC) 14.07.2009 Walther Rathenau Gewerbeschule 1 Was ist JDBC? Hauptsächlich eine Sammlung von Java Klassen und Schnittstellen für eine einfache Verbindung von Java Programmen
seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql
JDBC inoffizielle Abkürzung für: Java Database Connectivity seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql ist eine Menge von Klassen und Methoden, um aus Java-Programmen relationale Datenbanken
Client/Server-Programmierung
Client/Server-Programmierung WS 2013/2014 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 23. April 2014 Betriebssysteme / verteilte
CORBA-Konzept. Ziele. Common Object Request Broker Architecture CORBA. Plattformunabhängige Kommunikation Transparente Verteilung von Objekten
CORBA-Konzept Ziele Common Object Request Broker Architecture CORBA Plattformunabhängige Kommunikation Transparente Verteilung von Objekten CORBA-Konzept Object Management Group Spezifiziert den CORBA-Standard
Mobile und Verteilte Datenbanken
Mobile und Verteilte Datenbanken Java RMI Vorlesung Wintersemester 2013/2014 [email protected] Institut für Informationssysteme Universität zu Lübeck Kommunikations-Middleware Bietet höhere Kommunikations-Dienste
JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.
JDBC in 5 Schritten JDBC (Java Database Connectivity) ist eine Sammlung von Klassen und Schnittstellen, mit deren Hilfe man Verbindungen zwischen Javaprogrammen und Datenbanken herstellen kann. 1 Einrichten
Java RMI Remote Method Invocation
Java RMI Remote Method Invocation Ziel: Aufruf von Instanzmethoden entfernter Objekte basierend auf Java. Paket: java.rmi und Unterpakete Topologie: RMI Registry RMI Server RMI Client Der Server registriert
Rechnernetze II WS 2012/2013. Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404
Rechnernetze II WS 2012/2013 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 5. Mai 2014 Betriebssysteme / verteilte Systeme Rechnernetze
CORBA. Beispiel einer Middleware-Plattform. Christian Fass WS 2013/14 Software Engineering: Basistechnologien
CORBA Beispiel einer Middleware-Plattform Christian Fass WS 2013/14 Software Engineering: Basistechnologien Allgemeines Common Object Request Broker Architecture Middleware: Vermittelt zwischen Obekten/Prozessen
Modul Software Komponenten 10 Komponentenarchitektur
Modul Software Komponenten 10 Komponentenarchitektur Teil 3 Peter Sollberger Eine erste CORBA Anwendung Inhalt Dienstag, 4. November Object Request Broker CORBA Architektur und Komponenten (Teil 1) Übung:
Java-Programmierung. Remote Method Invocation - RMI
Java-Programmierung Remote Method Invocation - RMI Entwicklungsmethoden Sockets Entwurf verteilter Anwendungen ist relativ aufwändig, da zunächst ein Kommunikationsprotokoll entwickelt werden muss aufwändig
COMMON OBJECT REQUEST BROKER ARCHITECTURE. Dmytro Pyvovar Otto-von-Guericke Universität Magdeburg
COMMON OBJECT REQUEST BROKER ARCHITECTURE Dmytro Pyvovar Otto-von-Guericke Universität Magdeburg Gliederung Motivation Was ist CORBA? Object Management Architecture (OMA ) Interface Definition Language
CORBA. Systemprogrammierung WS 2006-2007
CORBA Systemprogrammierung WS 2006-2007 Teilnehmer: Bahareh Akherattalab Babak Akherattalab Inhaltsverzeichnis: Verteilte Systeme Vergleich zwischen lokale und verteilte Systeme Verteilte Anwendungen CORBA
Rechnernetze I. Rechnernetze I. 0 Organisation SS 2013. Universität Siegen [email protected] Tel.: 0271/740-4050, Büro: H-B 8404
Rechnernetze I SS 2013 Universität Siegen [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 18. Juli 2013 Betriebssysteme / verteilte Systeme Rechnernetze I (1/13) i Rechnernetze
CORBA. Eine kurze Einführung. Common Object Request Broker Architecture. Ying Lu
CORBA Common Object Request Broker Architecture Eine kurze Einführung Ying Lu Verlauf der Präsentation Was ist CORBA CORBA-Architektur Ein Beispiel CORBA im Einsatz CORBA im Vergleich Was ist CORBA Begriffe
Session Beans & Servlet Integration. Ralf Gitzel [email protected]
s & Servlet Integration Ralf Gitzel [email protected] 1 Themenübersicht Ralf Gitzel [email protected] 2 Übersicht Motivation Das Interface Stateful und Stateless s Programmierung einer Stateful
3. Stored Procedures und PL/SQL
3. Stored Procedures und PL/SQL Wenn eine Anwendung auf einer Client-Maschine läuft, wird normalerweise jede SQL-Anweisung einzeln vom Client an den Server gesandt, und jedes Ergebnistupel wird einzeln
Remote Method Invocation
Remote Method Invocation Aufruf von Methoden über die Grenzen der VM hinweg. Javaprozesse der rufenden und gerufenen Methode können auf verschiedenen Hosts laufen. Eine RMI-Applikation besteht aus dem
Web Services stellen eine Integrationsarchitektur dar, die die Kommunikation zwischen verschiedenen Anwendungen
9 3 Web Services 3.1 Überblick Web Services stellen eine Integrationsarchitektur dar, die die Kommunikation zwischen verschiedenen Anwendungen mit Hilfe von XML über das Internet ermöglicht (siehe Abb.
Übungen zu Softwaretechnik
Prof. Dr. Dr. h.c. M. Broy Lösungsblatt 11 Dr. H. Ehler, S. Wagner 23. Januar 2004 Übungen zu Softwaretechnik Aufgabe 16 Qualitätseigenschaften Broker-Pattern Beurteilen Sie das in Aufgabe 15 benutzte
Themen. Web Service - Clients. Kommunikation zw. Web Services
Themen Web Service - Clients Kommunikation zw. Web Services Bisher: Implementierung einer Java Anwendung und Bereitstellung durch Apache Axis unter Apache Tomcat Java2WSDL Erzeugen einer WSDL-Datei zur
Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)
Anleitung Ein einfaches RMI-Beispiel (ab Java.0) c Y. Pfeifer (Juni 014) 1 Ein einfaches RMI-Beispiel Vorgehensweise: 1. Java Projekt anlegen. Zwei Packages server & client erstellen Auf der Server-Seite
Einführung: Verteilte Systeme - Remote Method Invocation -
Einführung: Verteilte Systeme - - Prof. Dr. Michael Cebulla 11. Dezember 2014 Fachhochschule Schmalkalden Wintersemester 2014/15 1 / 43 M. Cebulla Verteilte Systeme Gliederung 1 2 Architektur RMI Kommunikation
Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München
Kapitel 4 Dynamisches SQL Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München 2008 Thomas Bernecker, Tobias Emrich unter Verwendung der Folien des Datenbankpraktikums aus dem Wintersemester
6.9 Java Server Pages
DocumentCollection dc = db.ftsearch(abfrage); Document d = dc.getfirstdocument(); while (d!= 0) { String Name = db.gettitle(); out.println(name + ""); d = dc.getnextdocument(); catch (NotesException
Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter
Die Programmiersprache Java Dr. Wolfgang Süß Thorsten Schlachter Eigenschaften von Java Java ist eine von der Firma Sun Microsystems entwickelte objektorientierte Programmiersprache. Java ist......a simple,
Szenario 3: Service mit erweiterter Schnittstelle
2. Hintergrundverarbeitung in Android: Services und Notifications Szenarien für lokale Services Szenario 3: Service mit erweiterter Schnittstelle Ein Service bietet zusätzliche Methoden an, über die sich
EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel [email protected]
EJB Beispiel JEE Vorlesung 10 Ralf Gitzel [email protected] 1 Stundenkonzept Gemeinsame Übung Stoff der letzten Stunde wird gemeinsam in einem Beispiel umgesetzt Details werden nochmals erklärt bzw.
VS Praktikum 03 Konzept
Darstellung der Architektur: Manager VS Praktikum 03 Konzept Account 3 3 7 6 NameServiceServer 4 5 2 1 2 1 Geldautomat Filiale Messagearten: Für jede unterschiedliche Message gibt es eine eigene Klasse:
Datenbank und Informationssysteme
Datenbank und Informationssysteme Inhaltsverzeichnis 1 Programmierung von Datenbankzugriffen 3 1.1 Architektur des SQL/CLI am Beispiel JDBC................... 4 1.2 Anfragen und Ergebnismengen in JDBC......................
Oracle: Abstrakte Datentypen:
Oracle: Abstrakte Datentypen: Oracle bietet zwei mögliche Arten um abstrakte Datentypen zu implementieren: Varying Array Nested Table Varying Array (kunde) kdnr kdname gekaufteart 1 Mustermann 1 4 5 8
Der lokale und verteilte Fall
Lokale Beans Der lokale und verteilte Fall RemoteClient Lokaler Client (JSP) RemoteSession/Entity-Bean Lokale Session/Entity-Bean 2 Lokale Beans Die bisher vorgestellten EJBswaren immer in der Lage auf
Programmieren II. Beispiele für RDBMS. Relationale Datenbanken. Datenbanken SQL. Dr. Klaus Höppner JDBC. Hochschule Darmstadt SS 2008
Programmieren II Datenbanken Dr. Klaus Höppner SQL Hochschule Darmstadt SS 2008 JDBC 1 / 20 2 / 20 Relationale Datenbanken Beispiele für RDBMS Ein Datenbanksystem ist ein System zur Speicherung von (großen)
Grundlagen von Datenbanken SS 2010 Kapitel 8: Datenbank-Einbettung in Programmiersprachen Prof. Dr. Stefan Böttcher Universität Paderborn
Grundlagen von Datenbanken SS 2010 Kapitel 8: Datenbank-Einbettung in Programmiersprachen Prof. Dr. Stefan Böttcher Universität Paderborn Grundlagen von Datenbanken - SS 2010 - Prof. Dr. Stefan Böttcher
3.2 Der CORBA-Standard Common Object Request Broker Architecture
3.2 Der CORBA-Standard Common Object Request Broker Architecture (Bildquelle: OMG) Kapitel 3.2: Vorlesung CORBA 1 CORBA Middleware im Ueberblick G CORBA = Common Object Request Broker Architecture. Standard
SQLJ. Standardisierte Java-DB. DB-Schnittstelle. Spezifikationen. Oracle, IBM, Informix, Sybase,, Tandem, Sun, Microsoft stehen dahinter
SQLJ Standardisierte Java-DB DB-Schnittstelle Spezifikationen Part 0: Embedded SQL für Java (ANSI-Standard; Object Language Binding) Statische Einbettung von SQL-Anweisungen in Java-Quelltext Part 1: Java
Webbasierte Informationssysteme
SS 2004 Prof. Dr. Stefan Böttcher Universität Paderborn - SS 2004 - Prof. Dr. Stefan Böttcher Folie 1 Was ist eine relationale Datenbank? Menge von Relationen (=Tabellen) und Constraints (=Integritätsbedingungen)
Webservices. 1 Einführung 2 Verwendete Standards 3 Web Services mit Java 4 Zusammenfassung. Hauptseminar Internet Dienste
Hauptseminar Internet Dienste Sommersemester 2004 Boto Bako Webservices 1 Einführung 2 Verwendete Standards 3 Web Services mit Java 4 Zusammenfassung Was sind Web Services? Web Services sind angebotene
Technische Beschreibung: EPOD Server
EPOD Encrypted Private Online Disc Technische Beschreibung: EPOD Server Fördergeber Förderprogramm Fördernehmer Projektleitung Projekt Metadaten Internet Foundation Austria netidee JKU Linz Institut für
Wiederholung: Beginn
B) Webserivces W3C Web Services Architecture Group: "Ein Web Service ist eine durch einen URI eindeutige identifizierte Softwareanwendung, deren Schnittstellen als XML Artefakte definiert, beschrieben
Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005
Einführung in Java PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Gliederung 1. Was ist Java / Geschichte von Java 2. Prinzip der Plattformunabhängigkeit 3. Wie kommt man vom Quellcode zum Programm
Client/Server-Systeme
Fachbereich Informatik Projektgruppe KOSI Kooperative Spiele im Internet Client/Server-Systeme Vortragender Jan-Ole Janssen 26. November 2000 Übersicht Teil 1 Das Client/Server-Konzept Teil 2 Client/Server-Architekturen
Verteidigung gegen SQL Injection Attacks
Verteidigung gegen SQL Injection Attacks Semesterarbeit SS 2003 Daniel Lutz [email protected] 1 Inhalt Motivation Demo-Applikation Beispiele von Attacken Massnahmen zur Verteidigung Schlussfolgerungen 2
-Testen verteilter Anwendungen
-Testen verteilter Anwendungen Seminar Simulation und Bildanalyse mit Java im SS04 Konstantin Tjo, Urs Pricking Testen verteilter Anwendungen 1 Übersicht Einführung in verteilte Anwendungen RMI (Remote
2. Datenbank-Programmierung
2. Datenbank-Programmierung SQL ist eingeschränkt bezüglich der algorithmischen Mächtigkeit, z.b. Berechnung einer transitiven Hülle ist in Standard-SQL nicht möglich. Die Einschränkung ist von Bedeutung
Beispiel: DB-Mock (1/7)
Beispiel: DB-Mock (1/7) Aufgabe: DB, auf die vereinfachend nur lesend zugeriffen wird mocken warum: benötigte keine DB-Lizenz, garantiert gleiche Werte ohne aufwändiges reset, kein Zeitverlust durch Verbindungsaufbau
Java Database Connectivity-API (JDBC)
Java Database Connectivity-API (JDBC) Motivation Design Grundlagen Typen Metadaten Transaktionen Pratikum SWE 2 M. Löberbauer, T. Kotzmann, H. Prähofer 1 Motivation Problem: Zugriff auf ein DBMS ist herstellerabhängig
explizite, orthogonale Interaktion Verteilte Anwendungen und Middleware uniforme / nicht-uniforme Interaktion implizite, nicht-orthogonale Interaktion
Verteilte Anwendungen und Klassifikation von Interaktionsformen explizit implizit orthogonal nicht-orthogonal uniform nicht-uniform transparent nicht-transparent explizite, orthogonale Interaktion weit
11.1 Indirektes Binden (3) 11.1 Indirektes Binden (4) Objektadapterkonfiguration. Unmittelbarer Vorteil des indirekten Bindens
11.1 Indirektes Binden (3) Objektadapterkonfiguration Name wird bei Erzeugung vergeben wird genutzt u.a. für Property-Zugriffe Adapter-ID wird über Property konfiguriert Beispiel: MyAdapter.AdapterID=MyAdapter
Java Database Connectivity-API (JDBC)
Java Database Connectivity-API (JDBC) Motivation Design Grundlagen Typen Metadaten Transaktionen Pratikum SWE 2 M. Löberbauer, T. Kotzmann, H. Prähofer 1 Motivation Problem: Zugriff auf ein DBMS ist Herstellerabhängig
Gesicherte Prozeduren
Gesicherte Prozeduren Wenn eine Anwendung auf einer Client-Maschine läuft, wird normalerweise jede SQL-Anweisung einzeln vom Client an den Server gesandt, und jedes Ergebnistupel wird einzeln zurückgeliefert.
Java und Datenbanksysteme Datenbankanbindung mit JDBC
Java und Datenbanksysteme Datenbankanbindung mit JDBC 30.05.2001 Stefan Niederhauser [email protected] 1-Einführung Datenbanksysteme Java und Datenbanken: JDBC Geschichte der JDBC-Versionen Vergleich von
JDBC. Allgemeines ODBC. java.sql. Beispiele
JDBC Java Data Base Connectivity Programmierschnittstelle für relationale Datenbanken Sammlung von Klassen, welche zum Aufbau einer Verbindung zwischen einem Java-Programm und einer Datenbank dienen Verwendet
Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...
PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:
Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck
Javadoc Programmiermethodik Eva Zangerle Universität Innsbruck Überblick Einführung Java Ein erster Überblick Objektorientierung Vererbung und Polymorphismus Ausnahmebehandlung Pakete und Javadoc Spezielle
Kapitel 10. JDBC und SQLJ. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1
Kapitel 10 JDBC und SQLJ 1 JDBC und SQLJ Bisher: Einbettung von SQL (statisch bzw. dynamisch) in C, C++, COBOL, ADA (embedded SQL) bzw. prozedurale Erweiterungen für SQL in Oracle (PL/SQL) Was ist mit
Zustandsgebundene Webservices
Zustandsgebundene Webservices Präsentation ausgewählter Problemstellungen der Informatik Markus Oertel [email protected] Universität Paderborn 25. September 2005 Zustandsgebundene Webservices Seite
Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.
Einfache Ein- und Ausgabe mit Java 1. Hallo-Welt! Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden. /** Die Klasse hello sendet einen
Remote Method Invocation
Remote Method Invocation spezielle Technik aus dem Java-Umfeld Ausführung der Methoden auf einem entfernten Rechner Analogon zum RPC (Remote Procedure Call) Zweck: Objekte in verschiedenen Java-VM s Aufruf
Rechnernetze Praktikum
Rechnernetze Praktikum WS 2014/2015 Betriebssysteme / verteilte Systeme [email protected] Tel.: 0271/740-4050, Büro: H-B 8404 Stand: 7. Oktober 2014 Betriebssysteme / verteilte Systeme
Einführung in die Programmierung
Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In
Mobile und Verteilte Datenbanken
Mobile und Verteilte Datenbanken Java RMI Vorlesung Wintersemester 2010/2011 [email protected] Institut für Informationssysteme Universität zu Lübeck Java Remote Method Invocation (RMI) Realisierung
Datenmanagement in Android-Apps. 16. Mai 2013
Datenmanagement in Android-Apps 16. Mai 2013 Überblick Strukturierung von datenorientierten Android-Apps Schichtenarchitektur Möglichkeiten der Datenhaltung: in Dateien, die auf der SDCard liegen in einer
SQL (Structured Query Language) Schemata Datentypen
2 SQL Sprachelemente Grundlegende Sprachelemente von SQL. 2.1 Übersicht Themen des Kapitels SQL Sprachelemente Themen des Kapitels SQL (Structured Query Language) Schemata Datentypen Im Kapitel SQL Sprachelemente
Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007
Systemprogrammierung Projekt: Java RMI Wintersemester 2006 / 2007 Systemprogrammierung 1. Einleitung 2. Einführung in RPC 3. RMI 4. Code Beispiele 5. Live Vorstellung 6. Ausblick 7. Fazit 2 1. Einleitung
Universität Stuttgart Abteilung Anwendersoftware 01.07.2002. - Steht für Embedded SQL in Java. - Java-Methoden als SQL Stored-Procedures
SQLJ Basics Universität Stuttgart Abteilung Anwendersoftware 01.07.2002 Was ist SQLJ? SQLJ Part 0: - Steht für Embedded SQL in Java SQLJ Part 1: - Java-Methoden als SQL Stored-Procedures SQLJ Part 2: -
