My download method looks like this:

private void downloadDirectory(FTPClient client, String sourceDir, String destDir, ScheduledExecutorService scheduledExecutorService) throws IOException {

        final FTPFile[] ftpFiles = client.listFiles(sourceDir);
        for (final FTPFile ftpFile : ftpFiles) {

            //skip . and ..
if (ftpFile.isDirectory() && (ftpFile.getName().equals(".") || ftpFile.getName().equals(".."))) {
                continue;
            }

            if (ftpFile.isDirectory()) {
downloadDirectory(client, sourceDir + ftpFile.getName(), destDir + "/" + ftpFile.getName(), scheduledExecutorService);
            } else {
// scheduledExecutorService.submit(new DownloadRunnable(destDir, ftpFile, sourceDir, client)); FileOutputStream fos = new FileOutputStream(ftpFile.getName());
                client.retrieveFile(sourceDir + ftpFile.getName(), fos );
                fos.flush();
                fos.close();
            }
        }
    }

When i run it like this, it works and it downloads the files. But when i use the scheduledExecuterService, it fails. So i replaced the 2 lines with my download method (where it uses the inputstream) to see what happens:

 } else {
// scheduledExecutorService.submit(new DownloadRunnable(destDir, ftpFile, sourceDir, client));
                new File(destDir).mkdirs();
                final File outFile = new File(destDir, ftpFile.getName());
                final FileOutputStream fos = new FileOutputStream(outFile);
final InputStream inputStream = client.retrieveFileStream(sourceDir + ftpFile.getName());

                byte[] buffer = new byte[8096];
                int len = -1;
                try {
                    len = inputStream.read(buffer, 0, buffer.length);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                while (len != -1) {
                    fos.write(buffer, 0, len);
                    len = inputStream.read(buffer);
                    if (Thread.interrupted()) {
                        throw new InterruptedException();
                    }
                }
                client.completePendingCommand();
// informListenersWeFinishedOneFile(sourceDir + ftpFile.getName(), bytesWritten);
                fos.flush();
                fos.close();
            }
        }

That works too?!

I will go deeper into that at weekend and check whats going on, but at the moment i really dont understand it. Maybe some kind of concurrency problem with FTPClient?


Am 29.08.2016 um 01:40 schrieb Martin Gainty:
possible timeout waiting for FTP to reply
examples.ftp.FTPClientExample says to increase FTP reply timeout with -w 
parameter
  if (args[base].equals("-w")) {                controlKeepAliveReplyTimeout = 
Integer.parseInt(args[++base]);            }
or with FTPClient:ftpClient.setControlKeepAliveReplyTimeout(2000); //2 sec 
reply timeout
?
Martin
______________________________________________



Date: Sun, 28 Aug 2016 20:06:46 +0200
From: e...@zusammenkunft.net
To: user@commons.apache.org
CC: oliver.zem...@gmail.com
Subject: Re: NPE in getRemoteAdress

Hello,

I am not sure about your NPE, but this code here ignores the result of
the read call. It cannot deal with short reads:

  Am Sun, 28 Aug 2016
15:50:36 +0200 schrieb Oliver Zemann <oliver.zem...@gmail.com>:
byte b[] =new byte[4096];
while (inputStream.read(b) != -1) {
   fos.write(b);
   bytesWritten += b.length;

Gruss
Bernd

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org

                                        


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org

Reply via email to