最近用org.apache.commons.net.ftp.FTPClient 寫ftp的上傳下載的定時任務
發現有時候線程會卡住,也不報錯就一直不工作了,后來發現需要使用ftp的被動模式才行,實現如下
以前有問題的代碼是這樣寫的
ftp.connect(odmInfo.getFtpserver(), port);// 連接FTP服務器
ftp.login(odmInfo.getFtpusername(), odmInfo.getFtppwd());// 登錄
reply = ftp.getReplyCode();
下面是修改后的代碼,login后需要調用ftp.enterLocalPassiveMode();
ftp.connect(odmInfo.getFtpserver(), port);// 連接FTP服務器
ftp.login(odmInfo.getFtpusername(), odmInfo.getFtppwd());// 登錄
//設置ftp為被動模式,解決有時候ftp會卡住問題
ftp.enterLocalPassiveMode();
reply = ftp.getReplyCode();
2019-08-22更新
后來發現只加入被動模式設置也不行,還需要加入超時設置
int reply;
ftp.setDefaultTimeout(30 * 1000);
ftp.setConnectTimeout(30 * 1000);
ftp.setDataTimeout(30 * 1000);
logger.info("start to connect ftp server");
ftp.connect(odmInfo.getFtpserver(), port);// 連接FTP服務器
logger.info("start to login ftp server");
ftp.login(odmInfo.getFtpusername(), odmInfo.getFtppwd());// 登錄
//設置ftp為被動模式,解決有時候ftp會卡住問題
ftp.enterLocalPassiveMode();
reply = ftp.getReplyCode();
logger.info("replyCode======"+reply);
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return uploadStatus;
}
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
boolean mkdirStatus=makeMultiDir(ftpBasePath,ftp);
if(!mkdirStatus)
{
logger.info("make multi dir error!");
return uploadStatus;
}