如果我运行我的Java RMI服务器作为守护进程(在&末尾),似乎它总是自动停止
这是启动RMI服务器的命令
java -Djava.security.policy=java.policy -cp .:lib/mysql-connector-java-5.1.7- bin.jar:lib/jsch-0.1.44.jar com.company.remote.server.rmi.RemoteServiceRmi &
这是打印输出:
user@agent033:~/remoteconfig> java -Djava.security.policy=java.policy -cp .:lib/mysql-connector-java-5.1.7-bin.jar:lib/jsch-0.1.44.jar com.company.remote.server.rmi.RemoteServiceRmi &
[3] 7437
Remote Object bind at (RMI): //10.***.***.***3002/RemoteConfigure
Remote Object: RemoteServiceImpl[UnicastServerRef [liveRef: [endpoint:[10.***.***.***:3003](local),objID:[3412cf8e:147646da428:-7fff, 7055633182216564676]]]]
Here I input a carriage return
[3]+ Stopped java -Djava.security.policy=java.policy -cp .:lib/mysql-connector-java-5.1.7-bin.jar:lib/jsch-0.1.44.jar com.company.remote.server.rmi.RemoteServiceRmi
如果我没有输入回车符,则“停止”行将不会显示。客户端仍然无法与服务器通信。客户将获得:
error during JRMP connection establishment; nested exception is:
java.net.SocketTimeoutException: Read timed out
如果我删除“&”在命令结束时,服务器可以成功启动,客户端可以毫无问题地与服务器通信。
这是服务器端RMI初始化的代码:
private void initializeRmiService() throws RemoteException, MalformedURLException {
int registryPort = Integer.parseInt(PropertyHandler.getProperty("rmi_regport"));
String connectionPort = PropertyHandler.getProperty("rmi_connport");
String rmiNamingUrl = "";
RemoteServiceInterface agent = new RemoteServiceImpl(Integer.parseInt(connectionPort));
rmiNamingUrl = "//" + PropertyHandler.getProperty("rmi_hostaddress") + ":" + registryPort + "/" + PropertyHandler.getProperty("rmi_naming");
logger.info("Remote Object bind at (RMI): " + rmiNamingUrl);
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
LocateRegistry.createRegistry(registryPort);
Naming.rebind(rmiNamingUrl, agent);
logger.info("Remote Object: " + agent);
}
答案 0 :(得分:1)
当您从shell运行某些内容并提供&
后缀时,会在后台中运行它。
这个问题与RMI没什么关系,可能与尝试从终端读取的后台进程有关。在大多数类Unix系统上,如果后台进程尝试从终端读取(通常但不总是其标准输入),操作系统将自动停止该进程。原因在于,由于该过程处于后台,因此可能还有一些其他过程在终端从前端读取。如果两个进程同时从终端读取,则进程的输入将以不可预测的方式交错,这将是不好的。
有关详细信息,请参阅this answer。
我敢打赌你的RMI服务器中的代码正在从System.in
读取。拿出来,你的过程应该在后台运行良好。 RMI的问题在于您的进程被操作系统停止,因此连接请求超时。如果您避免从终端阅读,则该过程不会在后台停止。在后台运行时,听到套接字并接受RMI连接应该没有问题。