Java RMI服务器作为守护进程运行,客户端连接被拒绝

时间:2014-07-23 18:37:33

标签: java rmi jobs

如果我运行我的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);
}

1 个答案:

答案 0 :(得分:1)

当您从shell运行某些内容并提供&后缀时,会在后台中运行它。

这个问题与RMI没什么关系,可能与尝试从终端读取的后台进程有关。在大多数类Unix系统上,如果后台进程尝试从终端读取(通常但不总是其标准输入),操作系统将自动停止该进程。原因在于,由于该过程处于后台,因此可能还有一些其他过程在终端从前端读取。如果两个进程同时从终端读取,则进程的输入将以不可预测的方式交错,这将是不好的。

有关详细信息,请参阅this answer

我敢打赌你的RMI服务器中的代码正在从System.in读取。拿出来,你的过程应该在后台运行良好。 RMI的问题在于您的进程被操作系统停止,因此连接请求超时。如果您避免从终端阅读,则该过程不会在后台停止。在后台运行时,听到套接字并接受RMI连接应该没有问题。