终止Java RMI服务器应用程序

我已经使用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停止它.

上一篇:Java中间件之RMI及实例介绍 · zijian's blog


下一篇:java-如何在服务器上从客户端调用方法?