Verteilung und Objektorientierung, Spontane

Werbung
Realisierung verteilter Anwendungen: Teil 4
Ralf Möller, FH-Wedel
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
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
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
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
Ergänzende Techniken
Objektmigration
Mobile Agenten
Applet-zu-Applet-Kommunikation
Gruppenkommunikation (Multicast)
Aktivierung von Objekten aus DB
Datenbankunabhängige verteilte Persistenz
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/
Entfernte Objekte
Erzeugung von Proxies zur Laufzeit
nicht wie bei RMI zur Übersetzungszeit vorbereitet
ähnlich wie bei RMI über lokalen Stellvertreter (Proxy)
local
invocation
proxy
reference
local
invocation
Proxy.of("B")
B
proxy
reference
local
invocation
Proxy.of("B")
local
invocation
B
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
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")
Fortsetzung des Beispiels
import com.objectspace.voyager.*;
public class Bat {
public void play(IBall ball) { ball.hit() }
public static void main(String args[]) {
Konstruktor
try {
ohne
Voyager.startup();
Argument
Bat bat = new Bat;
IBall ball = (IBall) Factory.create("Ball","sun:8000");
bat.play(ball);
} catch ( ... ) { ... }
Voyager.shutdown(); } }
Entfernte Konstruktoren mit Argumenten
Object[] arguments =
new Object[]{new Integer(5)};
IBall ball =
(IBall) Factory.create("Ball",
arguments,
"sun:8000");
Konstruktor
mit
Argumente
Objektmigration (1)
Anwendungsgebiete:
Zeitaufwand minimieren
Lastbalancierung
Besitz- oder Verantwortungswechsel
Mobile Geräte (bzw. nicht-permanent verfügbare Geräte)
Objektmigration (2)
Entfernter Zugriff
vs.
Migration
Objektmigration (3)
Protokoll für die Migration
try {
 IMobility mobileObj = MobilityOf(a);
 mobileObj.moveTo("vodka.fh-wedel.de:8000");
} catch (MobilityException e) {
 ... }
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
sun
Dd
Aa
lin
mac
Aa
IC c
Cc
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
sun
Dd
Aa
lin
mac
Aa
IC c
Cc
Cc
Aa
Probleme bei der Migration (2)
Was passiert mit referenzierten Objekten?
Kopiersemantik
Eventuell problematisch für "normale" Objekte
Unproblematisch für referenzierte Proxies
sun
Dd
Aa
lin
mac
Aa
IC c
Cc
Probleme bei der Migration (2)
Was passiert mit referenzierten Objekten?
Kopiersemantik
Eventuell problematisch für "normale" Objekte
Unproblematisch für referenzierte Proxies
sun
lin
mac
Dd
Aa
Aa
IC c
Cc
Aa
IC c
Behandlung laufender Aufrufe
import java.io.*;
public class Ball implements IBall, Serializable {
synchronized public void hit() {
System.out.println("Ball has been hit")
}
}
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);
Räume und Unterräume
sun
lin
win
Space
mac
Rechner
nt
Subspace
Verknüpfung
Verteilung von Nachrichten im Unterraum
Rechner
Nachricht
Objekt
sun
Subspace
 Object[] parameter = new Object[]{param};
 Multicast.invoke(subspace, "message", parameter, "Class");
 oder: IClass mcastProxy =
localSubspace.getMulticastProxy("Class");

mcastProxy.message(param);
Mobile Agenten: Kommunikationsschema
Ohne Agenten
vs.
mit Agenten
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???
Mobile Agenten: Einsatzgebiete
Verteilte Informationssuche
Börsenbeobachter
Elektronischer Preisvergleich
Mehrwertleistungen
Just-in-Time-Produktion
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)
Dienste in einer Umgebung
Music
service
gateway
Alarm
service
Internet
Hotel wireless
network
Discovery
service
Camera
TV/PC
Laptop
PDA
Guests
devices
Diensterbringung durch Server
Konfigurierungsproblematik
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
Jini: Registrierung
Jini: Lookup und Leasing
Was ist eine Gruppe / Föderation?
intranet
ISP
%
%
%
%
backbone
satellite link
desktop computer:
server:
network link:
Was ist eine Gruppe / Föderation?
email s erv er
Desktop
computers
print and other servers
Web server
Local area
netw ork
email s erv er
File s erv er
print
other servers
the rest of
the Internet
router/firew all
Multicast Request: Service Announcement
Datagramm-Paket auf 224.0.1.85 und Port 4160
Lookup
Service
Client
Nicht über
Router
geleitet
Service
Provider
Service Objekt
Service Attributes
Multicast Request: Service Announcement
Datagramm-Paket auf 224.0.1.85 und Port 4160
Lookup
Service
Service Proxy
Service Attribute
Client
Service
Provider
Service Objekt
Service Attribute
Multicast Request: Service Discovery
Datagramm-Paket auf 224.0.1.85 und Port 4160
Lookup
Service
Service Proxy
Service Attributes
Client
Service Attributes
Service
Provider
Service Objekt
Service Attributes
Multicast Request: Service Discovery
Datagramm-Paket auf 224.0.1.85 und Port 4160
Lookup
Service
Service Proxy
Service Attributes
Client
Service
Provider
Service Proxy
Service Attributes
Service Objekt
Service Attributes
Multicast Request: Lookup Announcement
Datagramm-Paket auf 224.0.1.84 und Port 4160
Lookup
Service
Nicht über
Router
geleitet
Softwarepakete in Java
import
import
import
import
import
java.rmi.*;
java.rmi.server.*;
net.jini.core.lookup.*;
sun.com.jini.lookup.*;
sun.com.jini.lease.*;
siehe:
Java in verteilten
Systemen
Marko Boger
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.")
}
}
Das Interface RemoteBall
import java.rmi.*
public interface RemoteBall extends Remote {
public void hit() throws RemoteException;
}
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:
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(); }
}
}
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);
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);
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) }
}
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();
}
}}
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
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
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
Herunterladen