Question

J'ai un appel RMI défini comme suit:

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

La fonction effectue une recherche dans la base de données et remplit les deux listes ArrayLists. La fonction d'appel n'obtient rien. Je crois que cela fonctionne avec les types de vecteur.

Dois-je utiliser le vecteur ou existe-t-il un moyen de le faire fonctionner sans passer deux appels? J'ai d'autres idées que j'utiliserais probablement, comme renvoyer une paire clé / valeur, mais j'aimerais savoir si je peux faire en sorte que cela fonctionne.

Mise à jour:
J'accepterais toutes les réponses données jusqu'à présent si je le pouvais. Je ne connaissais pas le coût du réseau, il est donc logique de retravailler la fonction pour renvoyer un LinkedHashMap au lieu des deux ArrayLists.

Était-ce utile?

La solution

Comme le mentionne Tom, vous pouvez transmettre des objets distants. Vous devez créer une classe pour contenir votre liste qui implémente Remote. Chaque fois que vous transmettez quelque chose qui implémente Remote en tant qu'argument, chaque fois que le destinataire l'utilise, il se retourne et effectue un appel distant en arrière à l'appelant pour qu'il utilise cet objet.

Autres conseils

Les arguments dans RMI appellent un sérialisé. La désérialisation sur le serveur crée une copie des listes. Si les listes restaient du côté client, le nombre d'appels réseau serait assez élevé. Vous pouvez transmettre des objets distants, mais méfiez-vous des conséquences pour les performances.

Vous perdez vos références lorsque vous effectuez l'appel à distance. Vous devrez renvoyer les listes plutôt que de vous attendre à ce qu'elles soient remplies par l'appel distant.

Comme d'autres l'ont déjà mentionné, lors du transfert d'objets en tant que paramètres à une méthode RMI, l'objet sera sérialisé, puis désérialisé à l'autre extrémité de l'objet cible contenant la méthode RMI. Cela sépare la référence des objets originaux transmis, car vous disposez maintenant de deux objets distincts: l'un dans le code client appelant la méthode et l'autre du côté distant.

Dans cet exemple spécifique, une meilleure approche consisterait à séparer vos appels de méthode (puisque vous semblez faire deux choses en même temps: obtenir les noms des clients et obtenir les numéros de clients) et renvoyer plutôt les résultats à l'appelant. que de passer dans une collection ... comme ceci:

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

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

Etant donné qu'ArrayList et String implémentent Serializable, les résultats de la collection seront sérialisés et envoyés sur le réseau au code client appelant la méthode. Vous pourrez alors utiliser les données à votre guise. Si, au contraire, vous devez utiliser un objet personnalisé dans la collection, tant que votre classe implémente l'interface java.io.Serializable et qu'elle est conforme à la spécification de cette interface, vous ne devriez rencontrer aucun problème.

Cela aboutirait à deux appels séparés sur le réseau filaire, ce qui constituerait une interaction beaucoup plus simple et plus claire et éviterait le problème de rupture de référence dans votre exemple initial.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top