LocateRegistry.createRegistry()不会使应用程序保持活动状态

时间:2018-01-03 12:17:40

标签: java rmi main rmiregistry remote-registry

我已经调试了每行代码以及多个工作示例,但出于某种原因,当我启动RMI服务器时,我的java应用程序才会关闭。

我希望java应用程序继续运行,因为我已经启动了一个注册表,并且我已经反弹了一个实现java.rmi.Remote的对象。

但是,应用程序会在创建所有内容后立即停止。

这是我的Main.java:

package com.distribridge.servercomponent;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

    private static Logger logger = Logger.getLogger(Main.class.getName());
    private static int portNumber = 1099;

    private Main() {
        logger.log(Level.INFO, "Starting component");

        Server server;
        try {

            server = new Server();
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Could not create server.");
            System.exit(1);
            return;
        }

        logger.log(Level.FINE, "Server created.");

        Registry registry;
        try {
            registry = LocateRegistry.createRegistry(portNumber);
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Could not create registry");
            System.exit(1);
            return;
        }

        logger.log(Level.FINE, "Registry created.");

        try {
            registry.rebind("server", server);
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Could not bind server.");
            System.exit(1);
            return;
        }

        logger.log(Level.FINE, "Server bound.");
        logger.log(Level.INFO, "Component started.");
    }

    public static void main(String[] args) {
        System.out.println("Start");
        Main main = new Main();
    }
}

我的Server.java看起来像这样:

public class Server implements IServerForClientLogin, IServerForClient, IServerForTable, Remote {
    Server() {
        System.out.println("Server Constructor");
    }

    //Some methods that don't get called yet.
}

服务器扩展的接口位于“共享”模块中。我用该模块启动了项目,并添加了像服务器这样的模块。

这是我的控制台输出:

Start 
Jan 03, 2018 1:10:05 PM com.distribridge.servercomponent.Main <init>
INFO: Starting component
Server Constructor 
Jan 03, 2018 1:10:05 PM com.distribridge.servercomponent.Main <init>
INFO: Component started.

Process finished with exit code 0

正如您所看到的,当注册表绑定了远程对象时,该过程会立即关闭。

1 个答案:

答案 0 :(得分:2)

存储Registry结果的LocateRegistry.createRegistry()需要是静态的。

否则它可以被垃圾收集,它会取消它,它允许它中的所有存根被GC'd,这允许它们引用的远程对象是DGC'd,它们取消它们,这允许RMI接受要退出的线程,这允许JVM退出。

但是你有另一个问题。您的Server还不是远程对象。您需要通过扩展UnicastRemoteObject或在其上调用UnicastRemoteObject.exportObject()来导出它。目前,它只是一个移动代理,可以通过身体运送到客户端并在那里执行。

Server无需直接实施Remote。它需要实现扩展 Remote的接口。