终止 Java RMI 服务器应用程序

2024-05-14

我已经使用 Java RMI 建立了一个客户端/服务器项目。下面我展示部分实现。我 使用启动服务器

ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/C", "start /B java -jar myServer.jar --start);
this.myProcess = processBuilder.start();

我已向服务器添加了一个处理命令行调用的 main 方法。 服务器启动并运行完美。客户端能够按照我的预期进行连接和执行。

当我尝试终止服务器时,我的问题出现了。这需要从外部完成。该对象 之前启动的进程不再可用。要真正停止服务器,主要方法 服务器类调用 stop 方法(见下文)。该方法现在杀死了 RMI,但它并没有 至少要阻止 JVM 运行。该进程仍然可用,需要从 任务管理器(在 Windows 上)。

我是否错过了我的实现中产生这种行为的一些事实?为什么进程不停止运行?

public class MyServer {

    // ...

    public void startServer() throws RemoteException {

        // the RMI registry
        Registry registry;

        try {
            // find the registry
            registry = LocateRegistry.createRegistry(portRMI);
        } catch (Exception e) {
            // if the registry does not yet exist, try to create a new registry
            // entry or use an existing one
            registry = LocateRegistry.getRegistry(MyConstants.HOST_NAME, portRMI);
        }

        // create the object
        servantObject = new MyServant();

        // bind the object to the server
        registry.rebind(MyConstants.SERVER_NAME, servantObject);
    }

    public void stopServer() throws RemoteException {

        try {
            // access the service
            Registry rmiRegistry = LocateRegistry.getRegistry(MyConstants.HOST_NAME, portRMI);
            MyService myService = (MyService) rmiRegistry.lookup(MyConstants.SERVER_NAME);

            rmiRegistry.unbind(MyConstants.SERVER_NAME);

            // get rid of the service object
            UnicastRemoteObject.unexportObject(myService, true);

            // get rid of the rmi registry
            UnicastRemoteObject.unexportObject(rmiRegistry, true);

        } catch (NoSuchObjectException e) {
            // ...
        } catch (NotBoundException e) {
            // ...
        }
    }

    public static void main(String[] args) {
        // handle arguments and call either startServer or stopServer
    }
}

public class MyServant extends UnicastRemoteObject implements MyService {
    // ...
}

public interface MyService extends Remote {
    // ...
}

您应该在 RMIServer 中添加一个可用的自写 RMIService 接口,以便希望停止正在运行的服务器的程序指示它停止。

尝试停止服务器的应用程序只是解除绑定某个对象,因为它不是正在运行的 rmi 服务器进程本身,因此不会产生很大的影响。

如果您的 rmi 服务器是进程 a,您应该编写一个作为进程 b 运行的应用程序(使用 rmi)来发送消息给进程 a 以停止它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

终止 Java RMI 服务器应用程序 的相关文章

随机推荐