如何在RMI方法中传递参数中的对象?
我试图在RMI方法中添加参数。 当我添加例如String
一切正常。 但我不确定我是否可以传递我创建的对象。 我是RMI的新手,所以我的代码非常简单:
HelloIF
public interface HelloIF extends Remote { String greeting(Context c) throws RemoteException; }
你好
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()); } }
最后我的class级上下文
public class Context { private String requestType; private String distributedThreadName; private List IDList; (...) getters/setters }
我该怎么做才能使传递上下文成为可能?
您的对象应该实现Serializable
。 我可以看到这将是一个问题。 这是必需的,因为两个部分之间的通信是使用序列化完成的,因此需要发送到另一部分的每个对象都需要是实现Serializable
的类的实例。
public class Context implements Serializable { private String requestType; private String distributedThreadName; private List IDList; (...) getters/setters }
请添加serialVersionUID
作为一种良好做法。 就像是:
private static final long serialVersionUID = 20120731125400L;