RMI pasa argumentos y valores de retorno de dos maneras: (! Que tiene que ser a distancia si su referencia)
Muestra
supongo que tenemos un servicio. Es un objeto RMI, publicado a través del registro RMI, por lo que es accesible para los clientes. El cliente puede llamar a un método (para crear algo) y el servicio quiere devolver una referencia a ese objeto recién creado. No es una copia serializada sino una referencia al objeto creado en el espacio de memoria del servidor.
import java.rmi.Remote;
import java.rmi.RemoteException;
// normally published object
public interface MyService extends Remote
{
// creates something and return a "handle" to it
public MyHandle createX(SomeSerializableObj param1) throws RemoteException;
}
// interface for object that the service will return a reference to...
public interface MyHandle extends Remote
{
void doOne();
void doTwo();
}
En este ejemplo, usted podría:
Crear una implementación de MyService y publicarla
Registry registry = LocateRegistry.createRegistry(port);
MyService stub = (MyService) UnicastRemoteObject.exportObject(server, 0);
registry.bind("myService", stub);`
y luego, algún cliente RMI podría obtener una referencia a ella
Registry registry = LocateRegistry.getRegistry(server, port);
MyService serv1 = (MyService) registry.lookup("myService");
y con una referencia al objeto de servicio podría obtener una referencia a otro objeto RMI.
MyHandle handle1 = serv1.createX(...);
handle1.doOne()
En este ejemplo se serializa el argumento de método (que debería ser una clase Serializable) mientras que el objeto devuelto es una referencia RMI a un objeto creado en el servidor.
La implementación de createX (...) Podría ser:
public MyHandle createX(...) {
MyHandle handle = new MyHandleImpl(); // create an implementation
createdHandlers.add(handle); // add it to some structure (just a sample)
return handle; // return the implementation. RMI will send to client a RMI reference to this very instance
}
gracias :) pero yo no lo entiendo muy bien su respuesta :( puede ofrecerle un ejemplo por favor? :) – MBZ
Claro ... No tengo un ejemplo que nos ocupa en ese momento ... – helios
@MBZ Se me parece que ya te ha dado un ejemplo, pero este es solo otro ejemplo de una referencia que se pasa por valor. No pasa por referencia en absoluto. Cambiar el valor de la referencia en el destinatario no lo cambia en la persona que llama. Voto abajo. – EJP