On 29 August 2016 at 18:28, Oliver Zemann <oliver.zem...@gmail.com> wrote: > 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?
That seems the most likely. FTPClient is not guaranteed to be thread-safe. I'm not sure that the java.io classes such as InputStream are thread safe either. > > 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 > --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@commons.apache.org For additional commands, e-mail: user-h...@commons.apache.org