2011-12-08 64 views
1

我通過我的Java應用程序中運行的rsync(的Solaris EVN)的Rsync通過java程序 - 與遠程連接失敗

的Java應用程序將同步與遠程計算機中的文件的問題。在我們的連接失敗測試中,我們注意到通過java程序運行rsync的問題。如果在同步過程中存在任何連接問題,則在源端運行的Java應用程序不會收到任何錯誤消息。

有關測試場景簡要說明:

  1. 我們運行Java程序
  2. Java程序啓動rsync命令和源同步的大量文件到遠程目標
  3. 在在同步過程中,我們運行ps -ef | grep rsync來檢查進程是否在運行(源端和目標端)。兩邊的rsync進程都在運行。
  4. 我們在目標機器上確定rsync進程標識並終止進程kill -9 <pid>
  5. java代碼沒有收到任何錯誤消息,也沒有退出。它只是掛起來。
  6. 還注意到rsync進程仍在源端運行,rsync進程也不在日誌文件中打印任何日誌消息。

    注意:如果我們直接運行rsync命令(不是通過java程序),那麼一切正常。當我們在目標處停止rsync進程時,源進程將停止。

    當RSYNC在目標處終止時,Java程序和RSYNC未檢測到目標有問題。沒有寫入日誌文件,Java程序將掛起並變得無法響應。

    通過perl其工作正常。不知道用java的問題...... !!!

    我沒有任何線索來調試此問題。 請分享您的想法和指向調試。

回答

1

在Java方面我建議創建兩個額外的線程來消耗你的方法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(); 
+0

感謝效應初探,線程方法也沒有爲工作我。看起來在rsync中有一個問題。如果我們使用rsync壓縮選項(-z),那麼它的工作原理是什麼呢?源RSYC現在能夠檢測到錯誤。例如:rsync -abvrz --delete/source// dest / –