alicjasalamon alicjasalamon - 1 month ago 12
Java Question

How to pass object in arguments in RMI method?

I am trying to add arguments in RMI method. When I add e.g.

String
everything works fine. But I am not sure if I can pass an object I created. I am new to RMI so my code is very simple:

HelloIF

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


Hello

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());
}
}


RMIServer

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());
}
}


RMIClient

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());
}
}


and finally my class Context

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

(...) getters/setters
}


What should I do to make passing Context possible?

Answer

Your object should implement Serializable. As I can see this would be one problem. It is needed because the communication between both parts is done using serialization, so each object that needs to be sent to the other part, needs to be an instance of class implementing Serializable.

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

   (...) getters/setters
}

and please add a serialVersionUID as a good practice. Something like:

private static final long serialVersionUID = 20120731125400L;