# RMI: Wo wird die Methode ausgeführt?



## Angel4585 (16. Okt 2007)

Hallo,

ich bin ja noch recht neu in Sachen RMI und stehe öfters vor der Frage:
Wo wird diese Methode nun ausgeführt? Auf dem Server oder auf dem Client?

Momentan beschäftigt mich folgender Fall:

Ich erzeuge auf dem Server ein Objekt mit der Methode "public String getName()".
In dieser Methode lese ich aus einer embedded DB auf dem Server einen Wert aus.
Jetzt übergebe ich dieses Objekt über eine Methode dem Client.
Der Client soll nun die Methode "getName()" aufrufen.
Wo wird die jetzt ausgeführt? Auf dem Server? 
Also wird versucht den Wert aus der DB auf dem Server auszulesen, oder wird versucht diese DB auf dem Client anzusprechen, obwohl es die hier ja nicht gibt?

Gibt es etwas womit ich mir generell merken kann wo eine Methode ausgeführt wird?


----------



## SlaterB (16. Okt 2007)

das hängt davon ab, wer die Operation aufruft,

ein Objekt kann nicht fliegen, es existiert in genau einer VM, entweder beim Server oder beim Client,
wenn der Server damit arbeitet, dann ist der Aufruf beim Server,

wenn das Objekt an den Client übertragen wird, dann passiert alles weitere damit beim Client


----------



## Angel4585 (16. Okt 2007)

Und wenn ich das Interface des Objekts übergebe?


----------



## SlaterB (16. Okt 2007)

Interface sind nur dafür da, dass du nicht die genaue Implementierung kennen musst,
das hat auf das Objekt/ die Übertragung und die Ausführung von Operationen keinen Einfluss


----------



## Angel4585 (16. Okt 2007)

OK, und wie setze ich es dann um das wenn die Methode "getName" aufgerufen wird, in jedem Fall der Datenbankaufruf auf dem Server stattfindet und das Ergebnis zurückgibt?
Dann müsste ich ja quasi in das Interface vom Server eine Methode "getName(MeinObjekt)" einfügen oder?


----------



## SlaterB (16. Okt 2007)

das einfachst ist, im Client nicht das Objekt zu befragen, sondern direkt den Server, ja,
oder beim Objekt-Laden dafür sorgen, dass der Name vorgeladen und im Objekt gespeichtert ist

der Client sollte generell keinen Code potentiell zur ausführung haben, der DB-Operationen enthält,
wenn ein Objekt DB-Operationen in seiner Klasse hat, dann solche Objekte am besten nicht aus dem Server rauslassen


----------



## Angel4585 (16. Okt 2007)

hmm..
kann ich auch das Interface des Objektes auf dem Server an den Client übergeben und daraus ein anderes Objekt erzeugen?

So das das Objekt auf dem Server in der Methode direkt aus der DB liest und das Objekt auf dem Client eben die Funktion des Servers aufruft.. geht das?


----------



## SlaterB (16. Okt 2007)

das ist durchaus ein gängiges Verfahren, ja,

Details und Verfahren kennn ich dazu aber nicht, außer dem Stichwort Proxy,

wobei das vielleicht mehr auf feste Objekte zur Kommunikation mit dem Server zugeschnitten ist,
die beim Client einmalig (ohne Übertragung) aufgebaut wurden,
weniger auf dynamisch ausgetauschte Objekte

http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-smartproxy.html?page=3


----------



## Yzebär (18. Okt 2007)

Du implementierst einfach zwei Arten von Objekten (die dasselbe Interface implementieren), eine Objektart, die du an den Client überträgst (zum nachladen aus der DB werden Servermethoden aufgerufen) und die andere Objektart, die du lokal auf dem Server benutzt (kann direkt aus er DB nachladen). Um die eine oder andere Objektart zur Laufzeit zu erzeugen, empfehle ich das Factorypattern bzw.  Abstrakte Fabrik.


----------



## SlaterB (18. Okt 2007)

mit Pattern ist es da nicht getan, man braucht automatische Wrapper, 
die für beliebige Operationen die gesamte RMI-Übertragung im Hintergrund abwickeln

sowas baut man kaum mal eben selber


----------

