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