Rsync через программу Java - проблемы с ошибкой удаленного подключения - PullRequest
1 голос
/ 08 декабря 2011

Я запускаю rsync через Java-приложение. (Solaris Evn)

Приложение Java синхронизирует файлы с удаленным компьютером. Во время нашего тестирования сбоя соединения мы заметили проблему при запуске rsync через Java-программу. Java-приложение, которое выполняется на стороне источника, не получает никаких сообщений об ошибках, если в процессе синхронизации возникают какие-либо проблемы с подключением.

Краткие сведения о тестовом сценарии:

  1. Запускаем программу Java
  2. java-программа запускает команду rsync и синхронизирует большое количество файлов из источника в удаленный пункт назначения
  3. Во время процесса синхронизации мы запускаем ps -ef | grep rsync, чтобы проверить, запущены процессы или нет на обеих сторонах (source и dest). Обе стороны rsync работают.
  4. Мы идентифицируем идентификатор процесса rsync на целевой машине и завершаем процесс с помощью kill -9 <pid>
  5. Java-код не получил сообщение об ошибке и не завершил работу. Он просто завис.
  6. А также заметил, что процесс rsync все еще выполняется на стороне источника, и процесс rsync также не печатает никаких сообщений журнала в файле журнала.

    Примечание: если мы запускаем команду rsync напрямую (не через программу java), то все работает нормально. Когда мы остановим процесс rsync у цели, исходный процесс будет остановлен.

    Когда RSYNC завершается на цели, программа Java и RSYNC не обнаруживают, что у цели есть проблемы. Файлы журнала не записаны, программа на Java зависает и перестает отвечать на запросы.

    Через Perl работает нормально. Не уверен, что проблема с Java ... !!!

    У меня нет никаких подсказок для устранения этой проблемы. Пожалуйста, поделитесь своими мыслями и указателем на отладку.

1 Ответ

1 голос
/ 09 декабря 2011

На вашей стороне Java я рекомендую создать два дополнительных потока для использования потоков p.getInputStream () и p.getErrorStream () вашего Процесса p.Я думаю, что это помогает rsync чувствовать себя более любимым и заботливым.

Примерно так (я игнорирую IOException для простоты - вам придется иметь с ними дело!):

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();
...