2008-09-17 18 views
0

in RMI Rückkehr Ich habe einen RMI Anruf bekam wie folgt definiert:Pass durch Verweis nicht für Arraylist

public void remoteGetCustomerNameNumbers(ArrayList<String> customerNumberList, ArrayList<String> customerNameList) throws java.rmi.RemoteException; 

Die Funktion führt eine Datenbank-Lookup und füllt die zwei Arraylisten. Die aufrufende Funktion erhält nichts. Ich glaube, das funktioniert mit Vektortypen.

Muss ich den Vector verwenden, oder gibt es eine Möglichkeit, dies ohne zwei Anrufe zu bewerkstelligen? Ich habe einige andere Ideen, die ich wahrscheinlich verwenden würde, wie ein Schlüssel/Wert-Paar, aber ich würde gerne wissen, ob ich das zur Arbeit bringen kann.

Update:
Ich würde alle bisher gegebenen Antworten akzeptieren, wenn ich könnte. Da ich die Netzwerkkosten nicht kannte, ist es sinnvoll, die Funktion so zu überarbeiten, dass anstelle der beiden ArrayLists eine LinkedHashMap zurückgegeben wird.

Antwort

1

Wie Tom erwähnt, können Sie entfernte Objekte übergeben. Sie müssten eine Klasse erstellen, die Ihre Liste enthält, die Remote implementiert. Jedes Mal, wenn Sie etwas übergeben, das Remote als Argument implementiert, kehrt es sich um, wenn die empfangende Seite es verwendet, und ruft einen Remoteaufruf zurück an den Aufrufer, um mit diesem Objekt zu arbeiten.

1

Sie verlieren Ihre Referenzen, wenn Sie den Remoteanruf tätigen. Sie müssen die Listen zurückgeben, anstatt zu erwarten, dass sie vom Remote-Aufruf ausgefüllt werden.

2

Argumente in RMI ruft eine serialisierte. Die Deserialisierung auf dem Server erstellt eine Kopie der Listen. Wenn die Listen auf der Clientseite verbleiben, wäre die Anzahl der Netzwerkaufrufe ziemlich hoch. Sie können entfernte Objekte weitergeben, aber achten Sie auf die Auswirkungen auf die Leistung.

1

Wie andere bereits erwähnt haben, wird das Objekt beim Übergeben von Objekten als Parameter an eine RMI-Methode serialisiert und dann am anderen Ende innerhalb des Zielobjekts, das die RMI-Methode enthält, deserialisiert. Dadurch wird die Referenz von den übergebenen Originalobjekten getrennt, da Sie nun zwei verschiedene Objekte haben: eines im Client-Code, der die Methode aufruft, und eines auf der Remote-Seite. In diesem speziellen Beispiel wäre ein besserer Ansatz, Ihre Methodenaufrufe aufzubrechen (da Sie scheinbar zwei Dinge in einer einzigen Methode tun: Kundennamen erhalten und Kundennummern erhalten) und stattdessen Ihre Ergebnisse an den Aufrufer zurückgegeben werden anstatt ... wie dies in einer Sammlung vorbei: Seit

public ArrayList<String> getCustomerNames() throws java.rmi.RemoteException; 

public ArrayList<String> getCustomerNumbers() throws java.rmi.RemoteException; 

beide Arraylist und String Serializable implementieren, werden die Ergebnisse in der Sammlung serialisiert und Aufruf der Methode über den Draht an den Client-Code gesendet werden, bei denen Sie können mit den Daten arbeiten, die Sie benötigen. Wenn Sie stattdessen ein benutzerdefiniertes Objekt in der Auflistung verwenden müssen, solange Ihre Klasse die Schnittstelle java.io.Serializable implementiert und der Spezifikation für diese Schnittstelle folgt, sollten Sie keine Probleme haben.

Dies würde zu zwei getrennten Aufrufen über die Leitung führen, ist jedoch eine viel sauberere und einfachere Interaktion und vermeidet das Problem der Referenzunterbrechung in Ihrem ursprünglichen Beispiel.