2009-04-21 18 views
5

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?

Respuesta

6

Es lo que se llama Proxy Pattern. La cosa instanciada en el extremo remoto ha generado código para transferir valores y activar métodos.

java.rmi.Remote en sí es solo una "interfaz de etiquetado". Necesita una implementación para hacer el trabajo real. Eche un vistazo a this JavaCamp tutorial para más.

Actualización: bien, yendo en la otra dirección, sí, necesita serializar el objeto y pasarlo por el cable. Probablemente lo mejor es trabajar primero a través del Java Tutorial on RMI. Pero, básicamente, Serializable es otra interfaz de etiquetado que le dice a Java que el objeto está preparado para convertirse en un formato de cadena interno, algo así como XML o YAML. Ese formato se puede "rehidratar" en un objeto coincidente en el extremo receptor, siempre y cuando los archivos de clase para ese objeto estén disponibles.

+0

No estoy seguro de haber entendido. Trataré de reformularlo ... –

+1

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

+0

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? –

Cuestiones relacionadas