This is a code snippet.
FtpDownloader.java
ExecutorService pool = Executors.newFixedThreadPool(5);
for (FTPFile file : files) {
if (!file.isFile()) continue;
pool.submit(new FtpFileDownloader(file));
}
FTPFileDownloader.java
public class FtpFileDownloader implements Runnable{
static Logger logger = LoggerFactory.getLogger(FtpFileDownloader.class);
private FTPFile file;
public FtpFileDownloader(FTPFile file) {
this.file = file;
}
private OutputStream outputStream;
@Override
public void run() {
try{
long start = System.currentTimeMillis();
String fileName = file.getName();
logger.info("File is {}", fileName);
outputStream = new BufferedOutputStream(new FileOutputStream("/home/user/Downloads/" + "FtpDownloads" + "/" + fileName));
//get the file from the remote system
ftpClient.retrieveFile(fileName, outputStream);
showServerReply(ftpClient);
logger.info("[{}ms, {} processing finished.]",System.currentTimeMillis()-start,fileName);
}catch (Exception e){
logger.info("FtpFileDownloader expection");
e.printStackTrace();
}finally {
try {
//close output stream
outputStream.close();
} catch (IOException e) {
logger.info("Io exception happened");
e.printStackTrace();
}
}
I've created a fixed thread pool of size 5. So after downloading 5 files from the server by each individual server
Thread is not disconnecting from the server even after its file is downloaded and waiting there for FTP server to disconnect
2022-03-01 15:49:33.584 INFO 10931 --- [pool-1-thread-5] t.a.f.listener.ftp.FtpFileDownloader : File is mail-send-winforms.png
2022-03-01 15:49:33.587 INFO 10931 --- [pool-1-thread-4] t.a.f.listener.ftp.FtpFileDownloader : File is mail-editor.png
2022-03-01 15:50:33.769 INFO 10931 --- [pool-1-thread-1] t.a.f.listener.ftp.FtpFileDownloader : FtpFileDownloader expection
2022-03-01 15:50:33.771 INFO 10931 --- [pool-1-thread-1] t.a.f.listener.ftp.FtpFileDownloader : File is mime-explorer.png
java.net.SocketTimeoutException: Connect timed out
at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:546)
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
at java.base/java.net.Socket.connect(Socket.java:633)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:866)
at org.apache.commons.net.ftp.FTPClient._retrieveFile(FTPClient.java:971)
at org.apache.commons.net.ftp.FTPClient.retrieveFile(FTPClient.java:3308)
at tech.adoptnet.ftppractice.listener.ftp.FtpFileDownloader.run(FtpFileDownloader.java:35)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
after downloading the files every thread is waiting until connection time out and then it goes to download other files.
How to make thread resuse itself without connection time out?