【问题标题】:Java RMI - NoSuchObjectException: no such object in Table (only via HTTP Proxy!)Java RMI - NoSuchObjectException:表中没有这样的对象(仅通过 HTTP 代理!)
【发布时间】:2016-05-24 07:09:32
【问题描述】:

我的 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:表中没有这样的对象” - 异常一直...... 这只发生,如果我使用 HTTP 隧道通过

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

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

可能是什么问题?

【问题讨论】:

    标签: java exception rmi http-proxy


    【解决方案1】:

    您将从sayHello() 而不是lookup() 获得此信息。异常的含义是存根是“陈旧的”,即远程对象未导出,这可能意味着它也已被 DGC 处理。您应该按此顺序尝试以下操作,一次一个:

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

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

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

    我无法解释为什么它只通过 HTTP 隧道发生,但无论如何你都应该做 (1),所以实际上这是一个等待通过任何方式发生的错误。

    【讨论】:

    • 感谢您的回复!在我的客户端中声明两者都已经是静态的:静态注册表注册;静态你好对象;但这没有用..
    • createRegistry() 由服务器而不是客户端调用。我指的是服务器。
    • 正确..仍然是同样的错误..一切都是静态的,但没有任何改变
    • 不在您发布的代码中。您正在丢弃createRegistry() 的结果,而不是将其存储在任何地方,更不用说在静态变量中了。
    • 是的,在你告诉我这个之后我改变了它。但即使我将 createRegistry() 的返回值存储在静态类变量中,它也不起作用
    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 2016-09-22
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多