java.rmi.NoSuchObjectException

时间:2014-06-04 14:24:06

标签: java eclipse rmi

我看过hereherehere但是我完全不知道为什么会遇到这个错误。

我认为我有强大的引用(帖子末尾的代码),我没有明确地调用GC(不是那个特定的方法做得太多)但是我只是不能启动这个该死的RMI服务器。

应该指出我对RMI非常新。我已经阅读了Oracle跟踪,但是没有用。试过另一个教程,同样的问题。事实上,无论我如何处理这个问题,我都无法通过这个ObjectNotFoundException。

现在我知道这意味着该对象不再存在,但为什么不存在...我在主类中有一个静态引用,如果VM严重行为错误,它正在这样做。

运行Arch Linux,oracle的VM和Eclipse kepler。

package engine;
import java.rmi.RMISecurityManager;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import service.Service;

public class Main { 

private static Service stub;
private static Service engine;

    public static void main(String[] args) {
        System.setProperty("java.security.policy", "file:///home/jameshey/git/MicroSense/release/conf/rmisecurity.policy");
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
        try {
            String name = "HelloWorldService";
            engine = new ServiceEngine();
            Registry registry = LocateRegistry.getRegistry(1099);
            stub = (Service) UnicastRemoteObject.exportObject(engine, 1099);
            registry.bind(name, stub);
            System.out.println("ServiceEngine bound");
        } catch (Exception e) {
            System.err.println("ServiceEngine exception:");
            e.printStackTrace();
        }
    }
}

我已经尝试了几乎所有可以找到的论坛解决方案。我没有尝试静态和静态变量的组合。完全难倒。

异常的堆栈跟踪是:

ServiceEngine exception:
java.rmi.NoSuchObjectException: no such object in table
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:275)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:252)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:378)
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
at engine.Main.main(Main.java:25)

1 个答案:

答案 0 :(得分:0)

LocateRegistry.getRegistry()不会创建注册表。它只是创建一个可能或可能不会实际工作的存根,具体取决于注册表是否正在运行。将其更改为createRegistry()。使Registry变量在服务器中保持静态。