我已经使用 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(使用前将#替换为@)