Java RMI Naming.lookup引发NotBoundException异常

Java RMI Naming.lookup引发NotBoundException异常,java,rmi,Java,Rmi,我在我的Rmi注册表中注册了一些对象,我检查它是否已完成,因为当我执行LocaterRegistry.getRegistry().list()时,它会生成两个注册表,如: 0 = "rmi://Mac.local/192.168.1.40:1099/DataService" 1 = "rmi://Mac.local/192.168.1.40:1099/AuthService" 然后,我打电话给 ServicioAutenticacionInterface authService = (Serv

我在我的Rmi注册表中注册了一些对象,我检查它是否已完成,因为当我执行LocaterRegistry.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的包中,该包被定义为服务器包的依赖项,它试图调用该查找。

您将URL传递给了
Registry.bind()/rebind()

  • URL被传递到
    Naming.bind()/rebind()/unbind()/lookup()
    ,并通过Naming.list()返回
  • 简单名称(如
    “AuthService”
    )被传递到
    注册表。bind()/rebind()/unbind()/lookup()
  • 无论传递给
    Registry.bind()/rebind()
    的是什么,都会由
    Registry.list()
    逐字返回
因此,由于
Registry.list()
返回URL,您必须通过
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"
这显然不是你想要的


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

java.rmi.NotBoundException:

我基于RMI的应用程序运行良好,直到我引入了另一个使用服务(WatchService)的函数,该服务有一个内部无限循环,因此这将使整个应用程序暂停

我的想法是,当服务器启动时,可能绑定过程没有完全发生,因为服务内部实现了循环,而服务在绑定阶段同时启动,因此当客户端查找服务器存根时,它找不到它,因为它最初没有绑定或注册/完整

当我删除函数/服务时,一切又正常了,但是因为我需要该服务/功能,所以我必须在服务器存根的同一类中的新线程上启动它

然后在主代码的某个地方启动上面定义的线程

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

这个开始监视()是具有无限循环的方法,在主类中定义,FileWatcherThread是主服务器类的内部类-它实际上取决于您如何完成实现和设计。只要想一想,然后看看它是否适合你的问题。

你“因为什么”而“得到空值”?因为Naming.lookup(“数据服务”)和LocateRegistry.getRegistry().lookup(“数据服务”);(a)这不是真的:您得到了一个异常,而不是null;(b)我在哪里告诉过你在
Naming.lookup()
中使用简单名称?请重读我写的东西。你是如何将这些对象绑定到注册表的?
new Thread(new FileWatcherThread()).start();