• Keine Ergebnisse gefunden

Verteilung und Objektorientierung, Spontane Vernetzung

N/A
N/A
Protected

Academic year: 2022

Aktie "Verteilung und Objektorientierung, Spontane Vernetzung"

Copied!
51
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Realisierung verteilter Anwendungen: Teil 4

 Beim vorigen Mal: RMI und Grundlagen von CORBA

 Inhalt heute

 Verteilung und Objektorientierung (Voyager)

 Spontane Vernetzung (Jini)

 Lernziele:

 Verständnis der Probleme und Lösungsansätze bei Objektmigration und spontaner Vernetzung

Ralf Möller, FH-Wedel

(2)

Voyager

 Zu Java kompatible Laufzeitumgebung und

Bibliothek, die auf eine umfassende Lösung für sehr viele Bereiche und Probleme der

Programmierung verteilter Systeme zielt

 Funktions- und Leistungsumfang wächst mit jeder neuen Version

 In dieser Vorlesung nur grundlegende Techniken

(3)

Basistechniken (1)

 Entfernte Objekte

 Erzeugung eines entfernten Objekts aus einem lokalen Objekt zur Laufzeit und zu jeder Java-Klasse

 Entfernte Referenzierung

 Transparente Referenzierung entfernter Objekte

 Typ: gemeinsames Interface

 Entfernte Erzeugung

 Erzeugung von Objekten in einer anderen VM (statt nur Erzeugung lokaler Objekte)

 Automatische Erzeugung von lokalen Stellvertretern

(4)

Basistechniken (2)

 Verteilte Garbage Collection

 Löschung erst, wenn weder lokale noch entfernte Referenz auf Objekte existieren

 Ausnahmebehandlung

 Weiterleitung von Ausnahmen, die bei einem entfernten Objekt auftreten, an ein lokales Objekt

 Namensdienst

 Bekanntmachung von entfernten Objekten über Namen

(5)

Ergänzende Techniken

 Objektmigration

 Mobile Agenten

 Applet-zu-Applet-Kommunikation

 Gruppenkommunikation (Multicast)

 Aktivierung von Objekten aus DB

 Datenbankunabhängige verteilte Persistenz

(6)

Voyager-Laufzeitumgebung

 Laufzeitumgebung starten:

Voyager.startup(String port)

auch: sun> voyager <port>

 Quellcode nachladen:

VoyagerClassLoader.addResourceLoader(String URL)

auch: sun> voyager 8000 -c file://usr/local/www/classes/

lin> voyager 7000 -c http://www.fh-wedel.de/classes/

 Integrierter HTTP-Server:

ClassManager.enableResourceServer()

auch: sun> voyager 8000 -r

win> voyager 9000 -c http://sun.fh-wedel.de:8000/

(7)

Entfernte Objekte

 Erzeugung von Proxies zur Laufzeit

 nicht wie bei RMI zur Übersetzungszeit vorbereitet

 ähnlich wie bei RMI über lokalen Stellvertreter (Proxy)

reference invocation

proxy local

local invocation

Proxy.of("B") B

reference invocation

proxy local

local invocation

Proxy.of("B") B

(8)

Beispiel: Baseball mit Voyager

 public class Ball {

 public void hit() {

System.out.println("Ball has been hit") }}

 public interface IBall {

 public void hit(); }

 public class Ball implements IBall, Serializable { ... }

 Tool zur Erzeugung von Interfaces: igen

(9)

Typkompatibles Proxy zu Interface erzeugen

 Lokale Erzeugung

 Proxy.of(Object obj)

 Namensdienst

 Namespace.bind("8000/Ball", iball)

 Entfernte Erzeugung

 Factory.create(String classname, String url)

 Beispiel:

 Ball ball = new Ball();

 IBall iball = (IBall) Proxy.of(ball)

 IBall iball = (IBall) Factory.create("Ball", "sun:8000")

(10)

Fortsetzung des Beispiels

 import com.objectspace.voyager.*;

 public class Bat {

 public void play(IBall ball) { ball.hit() }

 public static void main(String args[]) { try {

Voyager.startup();

Bat bat = new Bat;

IBall ball = (IBall) Factory.create("Ball","sun:8000");

bat.play(ball);

} catch ( ... ) { ... }

Voyager.shutdown(); } }

Konstruktor ohne

Argument

(11)

Entfernte Konstruktoren mit Argumenten

 Object[] arguments =

new Object[]{new Integer(5)};

 IBall ball =

(IBall) Factory.create("Ball",

arguments, "sun:8000");

Konstruktor mit

Argumente

(12)

Objektmigration (1)

 Anwendungsgebiete:

 Zeitaufwand minimieren

 Lastbalancierung

 Besitz- oder Verantwortungswechsel

 Mobile Geräte (bzw. nicht-permanent verfügbare Geräte)

(13)

Objektmigration (2)

 Entfernter Zugriff vs. Migration

(14)

Objektmigration (3)

 Protokoll für die Migration

 try {

 IMobility mobileObj = MobilityOf(a);

 mobileObj.moveTo("vodka.fh-wedel.de:8000");

 } catch (MobilityException e) {

 ... }

(15)

Probleme bei der Migration (1)

 Migration durch Kopie simulieren?

 Durch Migration muß Identität erhalten bleiben

 Laufzeitumgebung stellt Korrektheit von "alten"

Referenzen auf migrierte Objekte sicher

D d A a

IC c

A a C c

sun lin mac

(16)

Probleme bei der Migration (1)

 Migration durch Kopie simulieren?

 Durch Migration muß Identität erhalten bleiben

 Laufzeitumgebung stellt Korrektheit von alten Referenzen auf migrierte Objekte sicher

D d A a

IC c

A a C c

sun lin mac

A a C c

(17)

Probleme bei der Migration (2)

 Was passiert mit referenzierten Objekten?

 Kopiersemantik

 Eventuell problematisch für "normale" Objekte

 Unproblematisch für referenzierte Proxies

D d A a

IC c

A a C c

sun lin mac

(18)

Probleme bei der Migration (2)

 Was passiert mit referenzierten Objekten?

 Kopiersemantik

 Eventuell problematisch für "normale" Objekte

 Unproblematisch für referenzierte Proxies

D d

IC c

A a C c

sun lin mac

A a IC c A a

(19)

Behandlung laufender Aufrufe

 import java.io.*;

 public class Ball implements IBall, Serializable {

synchronized public void hit() {

System.out.println("Ball has been hit") }

 }

(20)

Gruppenkommunikation

 Multicast oder Publish-Subscribe-Mechanismus

 Voyager spaces and subspaces

Subspace localSubspace = new Subspace()

 Entfernter Zugriff über Namensraum

 Isubspace remoteSubspace =

(Isubspace) Namespace.lookup("//sun:9000/Subspace");

localSubspace.connect(remoteSubspace);

 localSubspace.add(client);

(21)

Räume und Unterräume

Space Rechner Subspace

sun lin

win mac nt

Verknüpfung

(22)

Verteilung von Nachrichten im Unterraum

 Object[] parameter = new Object[]{param};

 Multicast.invoke(subspace, "message", parameter, "Class");

 oder: IClass mcastProxy =

localSubspace.getMulticastProxy("Class");

 mcastProxy.message(param);

sun

Nachricht Rechner

Objekt Subspace

(23)

Mobile Agenten: Kommunikationsschema

 Ohne Agenten vs. mit Agenten

(24)

Bewegung und Aktion von Agenten

 Vorher: Explizite Migration von Objeken (Unterstützung der Methode moveTo)

 Aus welcher Motivation heraus werden Agenten bewegt?

 "Eigeninitiative!"

 BDI-Architektur

 Beliefs

 Desires

 Intentions

Wie kann man denn das hinkriegen???

(25)

Mobile Agenten: Einsatzgebiete

 Verteilte Informationssuche

 Börsenbeobachter

 Elektronischer Preisvergleich

 Mehrwertleistungen

 Just-in-Time-Produktion

(26)

Mobile Agenten: Bewertung

 Vorteile:

 Reduktion der Netzwerklast

 Möglichkeiten zum Offline-Gehen des Auftraggebers während der Agent aktiv ist

 Flexiblere Reaktion auf Umgebung möglich als z.B. RMI

 Nachteile:

 Komplexität der Programmierung/Erstellung

 Infrastruktur erforderlich

 Sicherheitsprobleme

(für Agenten und für jeweilige Wirtsumgebung)

(27)

Dienste in einer Umgebung

Internet

gateway

PDA

service Music

service

service Discovery

Alarm

Camera

Guests devices Laptop

TV/PC

Hotel wireless network

(28)

Diensterbringung durch Server

(29)

Konfigurierungsproblematik

(30)

Spontane Vernetzung

 Eintreten in eine Gruppe

 Dienste anbieten / anmelden für Gruppe

 Nachfrage nach Diensten einer Gruppe

 Mit einem Dienstinteressenten in Kontakt treten

 Konkreten Dienst für bestimmte Zeit zusagen

 Kein Fehler: sich einfach entfernen, wenn gerade keiner auf eine konkrete Diensterbringung wartet

 kein Fehler: sich einfach entfernen, wenn die Zeit für zugesagte Dienste abgelaufen ist

 Fehler: zugesagten Dienst nicht erbringen

(31)

Jini: Registrierung

(32)

Jini: Lookup und Leasing

(33)

Was ist eine Gruppe / Föderation?

intranet ISP

desktop computer:

backbone

satellite link

server:

network link:

(34)

Was ist eine Gruppe / Föderation?

the rest of

email server Web server

Desktop computers

File server

router/firewall print and other servers

other servers print Local area

network

email server

the Internet

(35)

Multicast Request: Service Announcement

 Datagramm-Paket auf 224.0.1.85 und Port 4160

Client

Lookup Service

Service Provider

Service Objekt Service Attributes

Nicht über Router geleitet

(36)

Multicast Request: Service Announcement

 Datagramm-Paket auf 224.0.1.85 und Port 4160

Client

Lookup Service

Service Provider

Service Objekt Service Attribute Service Proxy

Service Attribute

(37)

Multicast Request: Service Discovery

 Datagramm-Paket auf 224.0.1.85 und Port 4160

Client

Lookup Service

Service Provider

Service Objekt Service Attributes Service Attributes

Service Proxy Service Attributes

(38)

Multicast Request: Service Discovery

 Datagramm-Paket auf 224.0.1.85 und Port 4160

Client

Lookup Service

Service Provider

Service Objekt Service Attributes Service Attributes

Service Proxy Service Attributes

Service Proxy

(39)

Multicast Request: Lookup Announcement

 Datagramm-Paket auf 224.0.1.84 und Port 4160

Lookup

Service Nicht über

Router geleitet

(40)

Softwarepakete in Java

 import java.rmi.*;

 import java.rmi.server.*;

 import net.jini.core.lookup.*;

 import sun.com.jini.lookup.*;

 import sun.com.jini.lease.*;

siehe:

Java in verteilten Systemen

Marko Boger

(41)

Dienste: Beispiel Baseball

 public class Ball extends UnicastRemoteObject implements RemoteBall ServiceIDListener {

 public Ball throws RemoteException { super(); }

 public void serviceIdNotify(ServiceID id) { System.out.println("ServiceId is " + id);

}

 public hit() {

System.out.println("Ball has been hit.") }

 }

(42)

Das Interface RemoteBall

 import java.rmi.*

 public interface RemoteBall extends Remote {

 public void hit() throws RemoteException;

 }

(43)

Das Anmelden von Diensten (1)

 Klasse JoinManager und entspr. Konstruktor

 Übergabe des als Service angebotenen Objekts,

 dessen Beschreibung,

 eines Callback-Objektes und

 eines Leasing Managers:

(44)

Das Anmelden von Diensten (2)

 public class BallStarter {

 public static void main(String[] args) { try {

System.setSecurityManager(new RMISecurityManager ());

RemoteBall ball = (RemoteBall) new Ball();

LeaseRenewalManager renewal = new LeaseRenewalManager();

Entry[] attributes = new Entry[]{ new Name("Jini enabled ball") };

JoinManager join = new JoinManager(ball, attributes, (Ball) ball, renewal);

System.out.println("Ball started and registered at Lookup-Server");

 } catch (Exception e) { e.printStackTrace(); }

 }

 }

(45)

Lookup von Diensten: Suche durch Muster

 Klasse ServiceTemplate und entspr. Konstruktor

 Übergabe an Konstruktor entweder

 eines ServiceID-Objekts

 oder einer Service-Beschreibung:

einer Menge von Klassen

oder einer Menge von Attribut-Wert-Paaren

 Beispiel mit Service-Beschreibung als Klasse:

Class[] classes = new Class[] { RemoteBall.class };

ServiceTemplate template =

new ServiceTemplate(null, classes, null);

(46)

Zugriff auf den Dienstvermittler

 Repräsentation des Dienstvermittlers als Objekt

 Dienstvermittler enthält Registratur

 Suchmuster wird an Registratur übergeben

 Beispiel:

LookupLocator l = new LookupLocator("jini://sun");

ServiceRegistrar r = l.getRegistrar();

 RemoteBall = b = (RemoteBall) r.lookup(template);

(47)

Aufruf eines Dienstes (1)

 import java.rmi.*

 import net.jini.core.discovery.*;

 import net.jini.core.lookup.*;

 public class Bat {

 public void play(RemoteBall ball) { try {

ball.hit();

System.out.println("I hit the ball");

} catch (RemoteException e) { System.out.println(e) } }

(48)

Aufruf eines Dienstes (2)

 public static void main(String[] args) {

Bat bat = new Bat();

try { System.setSecurityManager(new RMI SecurityManager ());

LookupLocator locator = new LookupLocator("jini://sun");

ServiceRegistrar registrar = locator.getRegistrar();

Class[] classes = new Class { RemoteBall.class };

ServiceTemplate template = new ServiceTemplate(null, classes, null);

RemoteBall remoteBall = (RemoteBall) registrar.lookup(template);

bat.play(remoteBall);

} catch (Exception e) {

e.printStackTrace();

}

 }}

(49)

Starten und Aufrufen eines Dienstes

HTTP-Server, RMI-Daemon und Jini Lookup-Server starten

java -cp /usr/remote/java/jini1_0/lib/jini-examples.jar com.sun.jini.example.service.StartService

Server:

sun> java -Djava.rmi.server.codebase=http://localhost:8000/batBall/

-Djava.security.policy=/jini1_0/batball/policy.all BallStarter

sun| Ball started an registered at Lookup-Server

sun| ServiceId is f7a17bde-e40b-42cb-94d4-bb6d37a999b8

Client:

lin> java -Djava.security.policy=/jini1_0/batball/policy.all Bat

sun| Ball has been hit

lin| I hit the ball

(50)

Leasing

 public interface Lease {

 long getExpiration();

 void renew (long duration) throws LeaseDeniedException, UnknownLeaseException, RemoteException;

 void cancel() throws UnknownLeaseException, RemoteException;

 }

 Vorher verwendete Klasse LeaseRenewalManager

erneuert Leasing-Verträge automatisch

(51)

Auch beim nächsten Mal ...

 ... gibt's wieder Neues in der Diskussion über Middleware

 Datenbankanschluß (JDBC)

 Komponentenorientierte Softwarekonstruktion (Beans)

 Multitier-Architekturen (J2EE)

Enterprise Java Beans

Servlets, Java Server Pages

XML

Referenzen

ÄHNLICHE DOKUMENTE

Bytecode Maschinenlesbarer Code, der plattformunabhängig ist und durch einen (plattformabhängigen) Interpreter gelesen werden kann.. Plattform Rechner mit einem

Schreiben Sie die Funktion inorder mit akkumulierendem Parameter für binäre

Beispiel: graphische Objekte (zB circle , rectangle ) nebst Funk- tionen (z.B. center , move , rotate , print ). Insgesamt

• Python fängt im Objekt an, die Methode zu suchen (technisch gesehen können Methoden auch für individuelle Objekte definiert werden – praktisch werden sie immer in Klassen

First of all, we will code a base class which implements all the things that are shared by the two types of accounts: the attributes holder, number and balance, methods for deposit

• Modules sind einfach Dateien mit Python-Code, können Funktionen, Variablen, Klassen oder ausführbaren Code definieren.. • Module gruppieren zusammengehörigen Code

Eine Zinsrate, die für alle Sparkonten gemeinsam definiert ist, kann angewendet werden.. Auf das Konto kann Geld

 Bisher: Objekte sind Sammlungen von Daten (Beispiel: Klasse Adresse für Adressbuchverwaltung)..  Idee: Erweitere Objekte um Verhalten