2010-03-10 38 views
1

我想一些非常基本的RMI:Java RMI InitialContext:等效于LocateRegistry.createRegistry(int)?

// Context namingContext = new InitialContext(); 
     Registry reg = LocateRegistry.createRegistry(9999); 
     for (int i = 0; i < objs.length; i++) { 
      int id = objs[i].getID(); 
//   namingContext.bind("rmi:CustomObj" + id , objs[i]); 
      reg.bind("CustomObj" + id , objs[i]); 
     } 

即顺利工作,但对未来而言,我需要使用InitialContext

  Context namingContext = new InitialContext(); 
     for (int i = 0; i < objs.length; i++) { 
      int id = objs[i].getID(); 
      namingContext.bind("rmi:CustomObj" + id , objs[i]); 
     } 

但我无法得到这个工作。我从命令行启动了rmiregistry。有没有相当于LocateRegistry.createRegistry(int)?或者以其他方式启动InitialContext从我的课堂使用的RMI注册表/注册表?


(而不是命令行的)堆栈跟踪:

javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
     java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
     java.lang.ClassNotFoundException: bguiz.scratch.network.eg.Student] 
     at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:126) 
     at com.sun.jndi.toolkit.url.GenericURLContext.bind(GenericURLContext.java:208) 
     at javax.naming.InitialContext.bind(InitialContext.java:400) 
     at bguiz.scratch.RMITest.main(RMITest.java:29) 
Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
     java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
     java.lang.ClassNotFoundException: bguiz.scratch.CustomObj 
     at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396) 
     at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) 
     ....(truncated) 

编辑:我会删除我自己的问题在一两天的,因为似乎没有回答这个(我自己无法弄清楚)。最后呼吁任何咬人!

回答

1

经过多次修补,我已经解决了这个问题。 FYI,这是什么:

ClassNotFoundException由于RMI注册表有它自己的类路径而被抛出。包含InitialContext的类在其类路径中具有自定义对象并不重要 - 必须对RMI注册表进行初始化,以使自定义对象的类路径为以及

为此,请在启动rmiregistry之前在comman行上设置classpath环境值。如果此类路径包含自定义对象的类,则不会抛出ClassNotFoundException,并且随后可以避免使用ServerException和CommunicationException。

0

是否有相当于LocateRegistry.createRegistry(int)

或者一些其他的方式,从我的类中开始通过InitialContext的使用RMI注册/注册?

只有LocateRegistry.createRegistry()

我几乎可以肯定你需要在URL中指定主机名。你有什么异常&错误信息?

+0

@EJP我已经添加了堆栈跟踪到我的问题。另外,这个类将在服务器上运行 - 因此不需要指定URL(它将是本地主机)。客户端需要指定URL,并且由于我在同一台机器上进行了沙箱处理,所以它指定了“rmi:// localhost:1099 /”',但是我还没有那么远,因为这个类无法运行。 – bguiz 2010-03-10 10:02:29

0
java.lang.ClassNotFoundException: bguiz.scratch.network.eg.Student caused by 
java.lang.ClassNotFoundException: bguiz.scratch.CustomObj 

检查此类是否可用?

+0

是的,它绝对是 - 这是我检查的第一件事情之一。事实上,数组'objs []'是一个'CustomObj'数组,它被同一个类使用。我也证实它在类路径中。 – bguiz 2010-03-11 08:22:31