Frage

Ich habe einen RMI Anruf bekam wie folgt definiert:

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 Aufruffunktion bekommt nichts. Ich glaube, das funktioniert mit Vektor-Typen.

Muß ich den Vektor verwenden, oder gibt es eine Möglichkeit, dies ohne dass zwei Anrufe zur Arbeit zu kommen. Ich habe ein paar andere Ideen, die ich wahrscheinlich verwenden würde, wie ein Schlüssel / Wert-Paar zurückkehrt, aber ich würde gerne wissen, ob ich dies nicht erhalten zu arbeiten.

Update:
Ich würde alle Antworten bisher gegeben akzeptieren, wenn ich könnte. Ich hatte die Netzkosten nicht bekannt, so ist es sinnvoll, die Funktion zu überarbeiten einen LinkedHashMap anstelle der beiden Arraylisten zurückzukehren.

War es hilfreich?

Lösung

Wie Tom erwähnt, können Sie entfernte Objekte übergeben. Sie müssten eine Klasse erstellen Sie Ihre Liste zu halten, die Fern implementiert. Immer, passieren Sie etwas, das Fern als Argument implementiert, sobald die Empfangsseite verwendet es, es dreht sich um und macht einen Remote-Aufruf zurück an den Anrufer mit dem Objekt zu arbeiten.

Andere Tipps

Argumente in RMI ruft eine serialisiert. Deserialisation auf dem Server erstellt eine Kopie der Listen. Wenn die Listen auf der Client-Seite bleiben, dann würde die Zahl der Netzanrufe recht hoch sein. Sie können entfernte Objekte passieren, aber hüte dich vor den Auswirkungen auf die Leistung.

Sie verlieren Ihre Referenzen, wenn Sie den Remote-Anruf zu tätigen. Hier finden Sie die Listen zurückbringen müssen, anstatt zu erwarten, dass sie von dem Remote-Aufruf gefüllt werden.

Wie andere bereits erwähnt haben, wenn Objekte als Parameter an eine RMI-Methode übergeben, wird das Objekt serialisiert erhalten, dann am anderen Ende im Inneren des Zielobjekts deserialisiert die RMI-Methode enthält. Dies bricht die Referenz von den ursprünglichen Objekte übergeben, wie Sie jetzt zwei verschiedene Objekte haben. Ein im Client-Code Aufruf der Methode, und eine auf der Remote-Seite

In diesem speziellen Beispiel ein besserer Ansatz wäre Ihre Methodenaufrufe zu brechen (da Sie zwei Dinge in einem Verfahren zu tun scheinen: getting Kundennamen und bekommen Kundennummern) und stattdessen Ihre Ergebnisse zurückgegeben haben an den Anrufer eher als in einer Sammlung vorbei ... wie folgt aus:

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

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

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

Dies würde in zwei getrennten Anrufen über den Draht führt, ist aber eine viel saubere und einfache Interaktion und vermeidet die Referenz Problem in Ihrem ursprünglichen Beispiel zu brechen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top