Передача Java FTP прервана без ошибок - PullRequest
0 голосов
/ 29 августа 2018

У меня есть процесс резервного копирования по FTP, он работает с библиотекой org.apache.commons.net.ftp.FTPClient. Я обнаружил, что некоторые файлы частично загружены, и я не обнаружил ошибок при загрузке, иногда просто повторяя попытку, я решил проблему.

Это мой код FTP-соединения, я использую пассивный режим и keepalive:

public FTPClient ftpConnect(){
        FTPClient ftp = new FTPClient();
        int retries=3;
        int timeout=5000;
        URL url;
        try {
            url = new URL(REMOTE_URL);
            if(!url.getProtocol().equals("ftp"))
                throw new MalformedURLException();
        } catch (MalformedURLException e1) {
            throw new SystemException("Invalid protocol");
        }
        ftp.setConnectTimeout(timeout);
        ftp.setDataTimeout(timeout);
        for (int i = 1; i <= retries; i++) {
            try {
                ftp.connect(url.getHost(),url.getPort()>0?url.getPort():21);
                ftp.setSoTimeout(timeout);
                ftp.enterLocalPassiveMode();
                ftp.setKeepAlive(true);
                int reply = ftp.getReplyCode();
                if (!FTPReply.isPositiveCompletion(reply)) {
                    ftp.disconnect();
                    throw new ConnectException("FTP server refused connection");
                }
                if(StringUtils.isNotBlank(url.getUserInfo())){
                    String[] arr=URLDecoder.decode(url.getUserInfo(), "UTF-8").split(":");
                    String user=arr[0];
                    String pass=arr.length>0?arr[1]:"";
                    if (!ftp.login(user,pass)) {
                        ftp.logout();
                        throw new SecurityException("FTP server login not valid");
                    }
                }
                ftp.changeWorkingDirectory(url.getPath());
                break;
            } catch (SocketException e ) {
                log.error("Socket Error, retry nr {}",i);
                if(i==retries) throw new SystemException("Socket error, max retries reached");
            } catch (IOException e) {
                throw new SystemException("Connection Error");
            } catch (SecurityException e) {
                throw new SystemException("Invalid authentication");
            }           
        }
        return ftp;
    }

Я хотел бы знать, как Cand я решаю эту частичную загрузку и, прежде всего, как я могу получить ошибку в этих случаях.

...