Según tengo entendido, una vez que configuro un enlace de comunicación RMI entre dos sistemas, puedo pasar un objeto que implementa "Remoto" en uno de los métodos remotos que toma un objeto de ese tipo y el otro extremo simplemente obtenga la interfaz remota para el nuevo objeto (en otras palabras, se convertirá en una nueva conexión remota en lugar de simplemente serializar el objeto).RMI-¿Cómo funciona el paso de un objeto remoto a través de un método remoto?
¿Es esto correcto?
Si es así, supongo que esto tiene algo que ver con las firmas de métodos, pero me gustaría saber exactamente cómo determina que debe crear un nuevo objeto remoto en lugar de simplemente serializar todo el objeto.
Esto es realmente difícil de poner en palabras. Déjame probar esto:
Digamos que tengo un cliente y un sistema de servidor. En el sistema del servidor creo y publico un objeto RMI, en el sistema del Cliente recupero la interfaz y puedo interactuar con el sistema Servidor.
Client Server
Object1 RemoteIface ---- Object1 Implementation
Hasta ahora todo bien. En el Cliente, Object1.remoteMethod() se ejecutará en el Servidor (después de serializar los parámetros).
Ahora, aquí está la pregunta, en el cliente que ejecutar código como este:
Object2 object2=new object2(); // Also a remote object
object1.send(object2);
Según entiendo, en ese punto, mi sistema contará con un nuevo mecanismo de comunicación:
Client Server
Object1 RemoteIface ----- Object1 Implementation
Object2 Implementation ----- Object2 RemoteIface
En este punto, si el servidor llama a un método en Object2, ese método se ejecutará realmente en el cliente.
Me pregunto en qué punto el sistema decide hacer esto en lugar de simplemente serializarlo (como lo haría con cualquier objeto no remoto).
¿O estoy completamente equivocado y simplemente lo serializa de nuevo y necesito algún tipo de llamada al método "getRemoteInterface()" para realmente crear la llamada remota?
No estoy seguro de haber entendido. Trataré de reformularlo ... –
Parece que Charlie está interpretando tu pregunta tal como yo lo hice, y está justo en el blanco con su respuesta. Si pasa un parámetro (o devuelve un objeto) que implementa Remoto, se crea un esqueleto de proxy dinámico y se envía información de punto final dirigiéndose a ese esqueleto (algo así como una "referencia" en lugar de un "valor"). En el receptor, se crea un apéndice de proxy dinámico para hablar con el objeto remoto. La decisión de remota en lugar de serializar se basa en la interfaz remota. – erickson
De acuerdo, parece que lo hiciste bien y perdí un montón de tiempo reescribiendo mi pregunta. Pero, ¿podría ser más explícito en la parte "RemoteInterface"? Si simplemente lo lanzo a la interfaz remota, ¿eso hará que separe la interfaz de la implementación, o tiene que pasar por la llamada al método? –