¿Cómo pasar objetos en argumentos en el método RMI?

Estoy tratando de agregar argumentos en el método RMI. Cuando agrego por ejemplo String todo funciona bien Pero no estoy seguro de poder pasar un objeto que creé. Soy nuevo en RMI, por lo que mi código es muy simple:

HolaIF

public interface HelloIF extends Remote {
    String greeting(Context c) throws RemoteException;
}

Hola

public class Hello extends UnicastRemoteObject implements HelloIF {

    public Hello() throws RemoteException {
    }

    public String greeting(Context c) throws RemoteException {
        addToContext(c);
        report(c);
        return "greeting";
    }

    void addToContext(Context c) {
        c.addID(Thread.currentThread().getId());
    }

    void report(Context c) {
        System.out.println("Hello.greeting() thread : "
                + Thread.currentThread().getName() + " "
                + Thread.currentThread().getId());

        System.out.println("Hello.greeting() context : "
                + c.getDistributedThreadName() + " " + c.getRequestType());
    }
}

servidor RMIS

public class RMIServer {

    public static void main(String[] args) throws RemoteException, MalformedURLException {
        LocateRegistry.createRegistry(1099);
        HelloIF hello = new Hello();
        Naming.rebind("server.Hello", hello);
        System.out.println("server.RMI Server is ready.");
        System.out.println("RMIServer.main() thread : " + Thread.currentThread().getName() 
                + " " + Thread.currentThread().getId());
    }
}

Cliente RMIC

public class RMIClient {
    public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException {

        Context context = new Context("request1", Thread.currentThread().getName()+System.currentTimeMillis());

        Registry registry = LocateRegistry.getRegistry("localhost");
        HelloIF hello = (HelloIF) registry.lookup("server.Hello");
        System.out.println(hello.greeting(context));
        System.out.println("RMIClient.mian() thread : " + Thread.currentThread().getName() 
                + " " + Thread.currentThread().getId());
    }
}

y finalmente mi contexto de clase

public class Context 
{
    private String requestType;
    private String distributedThreadName;
    private List<Long> IDList;

   (...) getters/setters
}

¿Qué debo hacer para que sea posible pasar Contexto?

preguntado el 31 de julio de 12 a las 09:07

Aquí hay una forma de pasar argumentos por referencia: stackoverflow.com/questions/11187548/… -

1 Respuestas

Su objeto debe implementar Serializable. Como puedo ver, esto sería un problema. Es necesario porque la comunicación entre ambas partes se realiza mediante serialización, por lo que cada objeto que debe enviarse a la otra parte debe ser una instancia de implementación de clase. Serializable.

public class Context implements Serializable
{
    private String requestType;
    private String distributedThreadName;
    private List<Long> IDList;

   (...) getters/setters
}

y por favor agregue un serialVersionUID como una buena práctica. Algo como:

private static final long serialVersionUID = 20120731125400L;

respondido 01 nov., 16:21

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.