Hallo zusammen. Euer eigenes Fernhochrufsystem in Aufgabe 2 soll natürlich auch Rückrufe
unterstützen. Was das Konzept der Rückrufen ist und was ihr dabei beachten müsst, bespreche
ich in diesem Video. Verwendet habt ihr Rückrufe, im Englischen
auch Callbacks genannt, auch schon in Aufgabe 1.
Erinnert euch an das Interface von Vsauction Service. Es gibt hier zwei Methoden, RegisterAuction
und PlaceBit, die einen Parameter vom Typ Vsauction Event-Händler erwarten.
Der Händler wiederum ist dazu da, auf kleinen Seiten ein Event auszulösen, wenn es eine
Änderung zu einer Auktion gab und es dort dann auszugeben.
Ein Fernaufruf wird in dem Fall also nicht nur auf der Serverseite ausgeführt, sondern
muss selbst wiederum einen Fernaufruf zurück am Client ausführen. Also ein Rückruf.
Dazu muss der Server aber natürlich eine Referenz auf den Client haben, um dort den
Fernaufruf überhaupt ausführen zu können.
Am Ende vom Video zur Java RMI auf Aufgabe 1 wurde ein Beispiel zu genau diesem Thema
auch sehr ausführlich erklärt.
Das Problem bei der ganzen Sache ist jetzt eigentlich etwas viel Allgemeineres. Referenzen.
Bei einem Rückruf braucht der Server eine Referenz auf ein Objekt, das weiterhin am
Client liegt.
Bei lokalen Methoden aufrufen sind solche Referenzen einfach. Wenn sowohl Aufrufer als
auch Empfänger im selben Adressraum residieren, ist die Referenz auch auf beiden Seiten gültig
und kann innerhalb der Methode ganz normal verwendet werden.
Da ist ja auch keine spezielle Behandlung notwendig.
Im Fernaufruf gilt jetzt die erste Annahme allerdings nicht mehr. Client und Server haben
unterschiedliche Adressräume, eine Referenz in einem Adressraum hat erstmal keinerlei
Bedeutung in dem anderen, bzw. eine komplett völlig andere.
Innerhalb der aufgerufenen Methode können wir daher normalerweise nicht einfach die
Speicheradresse als Referenz verwenden.
Natürlich gibt es Konzepte wie verteilte gemeinsame Adressräume, auch Distribute Shared Memory
genannt, die theoretisch auch für Client-Server-Anwendungen verwendet werden können.
Für generische Client-Server-Konstrukte sind derartige Ansätze aber nicht geeignet.
Eine einfache Übertragung der Referenz so wie sie ist, ist daher nicht sinnvoll, da
der Server damit nichts anfangen kann.
Es braucht also eine spezielle Semantik für die Parameterübergabe bei Fernaufrufen.
Dafür gibt es verschiedene Umsetzungsmöglichkeiten in verteilten Systemen.
Ich stelle euch jetzt zwei davon vor.
Zuerst kann ein Rückruf mit dem Konzept CallByValueResult umgesetzt werden.
CallByValue ist die normale Parameterübergabe bei Fernaufrufen.
Es wird einfach eine volle Kopie des Parameters verwendet, also das Value der übergebenen
Variable.
CallByValueResult funktioniert jetzt ähnlich.
Bei einem Methodenaufruf wird dem Server eine Kopie des Objekts gegeben.
Innerhalb des Aufrufs kann diese dann die Kopie nach Belieben verändern und anschließend
wird sie an den Client zurückgesendet.
Dieser hat dann die Aufgabe, sein original Objekt, was er der Methode übergeben hat,
durch die Kopie zu ersetzen und so den neuen Zustand des Objekts zu speichern.
Die Vorteile liegen hier auf der Hand.
Die Implementierung davon ist relativ einfach.
Es braucht kaum Sonderbehandlungen.
Das veränderte Objekt kann zum Beispiel einfach als Rückgabewert der verändert Methode definiert
werden.
Nur muss in diesem Fall das Objekt natürlich sehr realisierbar sein, um die Kopie überhaupt
Presenters
Zugänglich über
Offener Zugang
Dauer
00:13:02 Min
Aufnahmedatum
2021-04-29
Hochgeladen am
2021-04-29 16:57:03
Sprache
de-DE
Implementierung von Rückrufen im eigenen Fernaufrufystem nach dem Abbild von Java RMI