У меня есть процесс резервного копирования по 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 я решаю эту частичную загрузку и, прежде всего, как я могу получить ошибку в этих случаях.