Pregunta

Tengo una llamada RMI definida como:

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

La función realiza una búsqueda en la base de datos y completa las dos ArrayLists.La función de llamada no obtiene nada.Creo que esto funciona con tipos vectoriales.

¿Necesito usar Vector o hay alguna manera de hacer que esto funcione sin hacer dos llamadas?Tengo otras ideas que probablemente usaría, como devolver un par clave/valor, pero me gustaría saber si puedo hacer que esto funcione.

Actualizar:
Aceptaría todas las respuestas dadas hasta ahora si pudiera.No conocía el costo de la red, por lo que tiene sentido reelaborar la función para devolver un LinkedHashMap en lugar de las dos ArrayLists.

¿Fue útil?

Solución

Como menciona Tom, puedes pasar objetos remotos.Tendrías que crear una clase para contener tu lista que implemente Remote.Cada vez que pasa algo que implementa Remoto como argumento, cada vez que el lado receptor lo usa, se da vuelta y realiza una llamada remota. atrás a la persona que llama para trabajar con ese objeto.

Otros consejos

Los argumentos en RMI llaman serializados.La deserialización en el servidor crea una copia de las listas.Si las listas permanecieran en el lado del cliente, entonces la cantidad de llamadas a la red sería bastante alta.Puede pasar objetos remotos, pero tenga cuidado con las implicaciones en el rendimiento.

Pierdes tus referencias cuando realizas la llamada remota.Deberá devolver las listas en lugar de esperar que la llamada remota las complete.

Como ya han mencionado otros, al pasar objetos como parámetros a un método RMI, el objeto se serializará y luego se deserializará en el otro extremo dentro del objeto de destino que contiene el método RMI.Esto rompe la referencia de los objetos originales pasados, ya que ahora tienes dos objetos distintos:uno en el código del cliente que llama al método y otro en el lado remoto.

En este ejemplo específico, un mejor enfoque sería dividir las llamadas a métodos (ya que parece que estás haciendo dos cosas en un método:obtener nombres de clientes y obtener números de clientes) y, en su lugar, devolver los resultados a la persona que llama en lugar de pasar una colección... como esta:

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

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

Dado que tanto ArrayList como String implementan Serializable, los resultados de la colección se serializarán y se enviarán por cable al código del cliente que llama al método, momento en el que podrá trabajar con los datos como necesite.Si, en cambio, necesita utilizar un objeto personalizado en la colección, siempre que su clase implemente la interfaz java.io.Serializable y siga la especificación para esa interfaz, no debería tener problemas.

Esto daría como resultado dos llamadas separadas por cable, pero es una interacción mucho más limpia y simple, y evita el problema de ruptura de referencia en su ejemplo original.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top