2

org.apache.commons.net.ftp.FtpClientを使用して、複数のファイルを並行してダウンロードし、失敗時に再試行する信頼できる FTP クラスを作成しました。

奇妙なことに、コードに障害を認識させることができないようです。たとえば、転送の途中でイーサネット ケーブルを引っ張ると、コードは次の場所でブロックし続けているように見えます。

client.retrieveFile(nextFile, ftpOutputStream);

ライン。false を返すか、例外をスローするのではなく、この行でブロックする理由を誰か教えてもらえますか? タイムアウトなどの設定を忘れましたか?

try {
    OutputStream ftpOutputStream = new FileOutputStream(fileName);

    System.out.println("Attempting to retrieve file [" + nextFile + "].");
    success = iclient.retrieveFile(nextFile, ftpOutputStream);
    System.out.println("Returned from retrieving file [" + nextFile + "].");

    ftpOutputStream.close();
}

//Can fail due to FTPConnectionClosedException, CopyStreamException, or IOException.  In any case, best course
//of action is to simply create a new connection, log in again, and change back to target directory.
catch(Exception ex) {

    try {
        System.out.println("Error occurred during download, deleting file and restarting.");
        Thread.sleep(1000);

        //Delete the failed file assuming any of it got written to the local drive.
        File f = new File(fileName);                        
        if(f.exists()) {
            System.out.println("Deleting file...");
            f.delete();
        }             

        Thread.sleep(5000);
    }
    catch (InterruptedException iex) {
        System.out.println("Interrupted exceptoin while respoding to failed FTP attempt.");
    }
}
4

1 に答える 1

1

「これを回避する方法は、独自の SocketFactory を実装し、SocketClient.setSocketFactory (FTPClient は SocketClient のサブクラスです) で設定することです。SocketFactory を実装するときは、setConnectTimeout メソッドなどを追加します。createSocket メソッド内で、タイムアウトのある J2SE 1.4 接続メソッド。」

「接続タイムアウトを設定するにはどうすればよいですか?」を参照してください。 その理由については、Commons Net FAQで質問してください。

于 2012-10-01T22:07:27.003 に答える