通过java程序的Rsync - 远程连接失败的问题

时间:2011-12-08 16:57:28

标签: java solaris rsync

我正在通过我的java应用程序运行rsync。(Solaris Evn)

Java应用程序将使文件与远程计算机同步。在我们的连接失败测试期间,我们注意到通过java程序运行rsync的问题。如果在同步过程中出现任何连接问题,则在源端运行的Java应用程序不会收到任何错误消息。

有关测试方案的简要信息:

  1. 我们运行Java程序
  2. java程序启动rsync命令并将大量文件从源同步到远程目标
  3. 在同步过程中,我们运行ps -ef | grep rsync以检查进程是否正在运行(源和目标)。两个端rsync进程都在运行。
  4. 我们在目标计算机上识别rsync进程ID并使用kill -9 <pid>
  5. 终止进程
  6. java代码没有收到任何错误消息,也没有退出。它只是挂了。
  7. 并且还注意到rsync进程仍然在源端运行,并且rsync进程也没有在日志文件中打印任何日志消息。

    注意:如果我们直接运行rsync命令(而不是通过java程序),那么一切正常。当我们在目标处停止rsync进程时,源进程将停止。

    当RSYNC终止于目标时,Java程序和RSYNC未检测到目标有问题。没有写入日志文件,Java程序将挂起并变得无响应。

    通过 perl 工作正常。不确定java有什么问题...... !!!

    我没有任何线索来调试此问题。 请分享您的想法和指向调试的指针。

1 个答案:

答案 0 :(得分:1)

在Java端,我建议创建两个额外的线程来使用Process p的p.getInputStream()和p.getErrorStream()流。我认为这有助于rsync感受到更多的爱和关心。

这样的事情(我为了简单而忽略了IOExceptions--你将不得不处理它们!):

final Process p = Runtime.exec("rsync"); // however you do this...

Runnable consumeIn = new Runnable() {
  public void run() {
    InputStream in = p.getInputStream();
    InputStreamReader isr = new InputStreamReader(in, "UTF-8");
    BufferedReader br = new BufferedReader(isr);
    String line;
    while ( (line = br.readLine()) != null ) {
      // Throw away the data?  Or do something with it if you like!
    }
  }
};

Runnable consumeErr = new Runnable() {
  public void run() {
    InputStream in = p.getErrorStream();
    // etc... (very similar to consumeIn)
  }
};

new Thread(consumeIn).start();
new Thread(consumeErr).start();