Java RMI - NoSuchObjectException:表中没有这样的对象(仅通过HTTP代理!)

时间:2016-05-24 07:09:32

标签: java exception rmi http-proxy

我的RMI测试出了问题...

服务器:

LocateRegistry.createRegistry(non-default-port);
obj = new HelloImpl(); 
Naming.rebind("//ip-of-server/HelloServer", obj);

客户端:

RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpToCGISocketFactory());

obj = (Hello) LocateRegistry.getRegistry("ip of server", non-default-port).lookup( "HelloServer");

obj.sayHello("test");

所有对象在类中都是静态的。

但是我得到了一个“java.rmi.NoSuchObjectException:表中没有这样的对象”-Exception一直都是.. 如果我通过

使用HTTP隧道,则只会发生这种情况
RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpToCGISocketFactory());

如果我尝试没有HTTP隧道(来自普通网络中的其他PC),它可以正常工作!

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

您将从SELECT而非sayHello()获取此信息。异常的含义是存根是“陈旧的”,即远程对象已被取消导出,这可能意味着它也是DGC。您应该按顺序尝试以下一项:

  1. 保持对lookup()返回的值的静态引用。

    这本身就足够了,但如果不是:

  2. 保持对远程对象本身的静态引用,不,我不是指它的存根。在这种情况下,createRegistry()

  3. 我无法解释为什么它只通过HTTP隧道发生,但无论如何你应该在所有情况下做(1),所以真的是等待通过任何方式发生的错误。