RMI Naming.lookup抛出NotBoundException

时间:2017-01-10 21:55:40

标签: java rmi

我在我的Rmi注册表中注册了一些对象,我检查它是否已完成,因为当我执行LocateRegistry.getRegistry()。list()时会产生两个注册表,如:

0 = "rmi://Mac.local/192.168.1.40:1099/DataService"
1 = "rmi://Mac.local/192.168.1.40:1099/AuthService"

然后,我打电话给

ServicioAutenticacionInterface authService = (ServicioAutenticacionInterface) Naming.lookup("rmi://Mac.local/192.168.1.40:1099/AuthService");

抛出NotBoundException ..

只是说接口位于名为commons的包中,定义为服务器包的依赖项,它试图调用该查找。

2 个答案:

答案 0 :(得分:0)

您将网址传递给Registry.bind()/rebind()而不只是名称。

  • 网址传递给Naming.bind()/rebind()/unbind()/lookup(),并由Naming.list()`。
  • 返回
  • 简单名称(例如"AuthService")将传递给Registry.bind()/rebind()/unbind()/lookup()
  • 您传递给Registry.bind()/rebind()是由Registry.list() 逐字返回的。

Ergo,Registry.list()正在返回网址,您必须通过Registry.bind()/rebind()提供这些网址。

要获得证明,请尝试Naming.list("rmi://Mac.local/192.168.1.40:1099")。它会返回:

0 = "rmi://Mac.local/192.168.1.40:1099/rmi://Mac.local/192.168.1.40:1099/DataService"
1 = "rmi://Mac.local/192.168.1.40:1099/rmi://Mac.local/192.168.1.40:1099/AuthService"

这显然不是你想要的。

因此,您需要使用具有相同网址字符串的Naming.bind()/rebind(),或者删除字符串的网址部分并继续使用Registry.bind()/rebind()

答案 1 :(得分:0)

<强> java.rmi.NotBoundException:

我的基于RMI的应用程序工作正常,直到我介绍了另一个使用服务(WatchService)的功能,该服务有一个内部的 无限循环 ,所以这会停滞不前整个申请。

我的想法是,当服务器启动时,由于服务内部实现了循环,绑定过程可能没有完全发生,并且服务是在绑定阶段同时启动的,所以当客户端来看时对于服务器存根,它无法找到它,因为它首先没有绑定或注册/完全。

当我删除功能/服务时,一切都运行正常,但由于我需要服务/功能,我必须在服务器的同一类内的新线程上启动它存根就像这样

   private class FileWatcherThread implements Runnable {
        public FileWatcherThread() {
        }

        @Override
        public void run() {
          startMonitors();
        }
    }

然后在主代码中的某处开始上面定义的线程。

new Thread(new FileWatcherThread()).start();

startMonitors(); 是具有无限循环的方法,并在主类中定义, FileWatcherThread < / strong>是主服务器类的内部类 - 它实际上取决于您完成实现和设计的方式。得到这个想法然后看看它是否适合你的问题。