Java RMI:setup-method立即返回,并且没有创建RMI线程

时间:2014-05-09 23:30:38

标签: java rmi

我正在尝试设置一个简单的RMI服务器,该服务器绑定到注册表,以便客户端获取所有进一步的通信。我使用下面的代码:

public class RMIServer implements ServerInterface {

    static Registry reg;

    public static void main(String[] args) throws NoSuchObjectException {
        //Registry reg;
        try {
            reg = LocateRegistry.createRegistry(1099);
            System.out.println("Registry created.");
        } catch (RemoteException ex) {
            System.err.println("Registry already existed.");
            return;
        }
        ServerInterface server = new RMIServer();
        ServerInterface stub;
        try {
            stub = (ServerInterface)UnicastRemoteObject.exportObject(server, 0);
        } catch (RemoteException ex) {
            System.err.println("Could not create stub.");
            ex.printStackTrace();
            return;
        }
        try {
            reg.rebind("server", stub);
            System.out.println("Server bound to registry.");
        } catch (RemoteException ex) {
            System.err.println("Could not bind server to registry.");
            ex.printStackTrace();
            //UnicastRemoteObject.unexportObject(server, true);
            return;
        }
    }
    ...
}

在我的本地计算机上进行测试时,这非常正常,我可以在(本地)客户端和服务器之间建立连接。上面的主要方法在我手动终止之前不会退出,这是预期的行为。我的本地机器(Win8)运行Java 1.7.0_17 64位。

现在,当我在带有OpenJDK(版本1.7.0_55 64位)的Ubuntu 12.04服务器上执行与上述相同的代码时,主方法和整个JVM立即退出并且RMI线程不运行。没有打印错误消息;我只收到有关正在创建的注册表和绑定到注册表的服务器的消息。显然客户端无法连接,因为服务器上没有运行RMI进程。

据我所知,只要有未导出的导出对象,主方法就不应自动退出。但它确实在我的一台机器上运行。

有没有人知道我在这里缺少什么?

谢谢!

更新1: (对不起,最近很忙,直到现在还没有机会再看看这个)。即使在更新到Ubuntu 14.04之后,Java 6,7,OpenJDK和Sun的版本仍然存在问题。

然而,我设法在云中托管的完全不同的机器上重现了这个问题,同时运行Ubuntu服务器14.04 x64(虽然除了java安装之外几乎完全干净)。我仍然试图弄清楚如何重现它(但是当我知道更多时会更新)。

在两台计算机上重新启动系统时问题消失(暂时似乎)。 为了完整性:奇怪的是,在系统日志级别设置为FINE或FINEST的情况下,代码突然按预期运行。我还是难过。

1 个答案:

答案 0 :(得分:0)

制作' reg'变量静态。否则它将对GC和DGC负责,它将取消它,这反过来将导致服务器的DGC及其未导出,这反过来导致套接字关闭和监听线程退出。