Hi This would be the first time I hear about this. Do you have only one active Camel application (node) that runs this route with the FTP consumer?
If you can reproduce this on a test environment, then you are also welcome to try with Camel 3.11.0 release. On Thu, Jul 1, 2021 at 5:12 PM Carsten Bulow <carsten.bu...@process-factory.dk> wrote: > > Hi Camel team, > > I'm currently looking into a production issue we're having that has led to > data loss. I've tried searching for solutions but to no avail. In short, what > we're experiencing is that a Camel route downloads several files from a FTPS > server and saves them to a local file path. Some files are fine, some files > have had their content replaced by the content of another file. > > As an example, 3 files: Test1.xml, Test2.xml, Test3.xml. The content of file > Test3.xml has been replaced by the content of file Test1.xml. Test1.xml and > Test2.xml are unaffected. In my world this is a "should never be able to > happen"-error. > > The issue doesn't happen every day and I can see in our logs that the > retrieve file operations have failed on days with error in files. We're > getting read time out and cannot retrieve file exceptions, possible because > the supplier is currently writing to the file or having a file lock, I don't > know. My assumption is that the route will re-try to fetch the file and > somehow the active context filename of one filename is transferred into > another context (not sure of the inner workings) of another file leading to > using an incorrect filename. I don't have any idea how this can happen. > > We didn't use the fileExist option when writing the files because we know the > file supplier uses unique filenames but I made an immediate hotfix adding > fileExist=Move to the route so we'll at least have a backup. > > Any help with this issue will be appreciated. > > > Further details: > New application that has been running for two weeks before first issue. We've > had the issue on 4 separate occasions. We've been using older Camel versions > for almost a decade that has a similar route with no issues. > Camel 3.8.0 > Spring Boot 2.4.2 > Windows Server 2016, Java 8 (AdoptOpenJDK jdk-8.0.282.8) > > > The route, using Java DSL: > Sort the files on the FTPS server, download each file, save file in an > archive folder by date and then in a different folder for further handling. > > from(uri) > .routeId("consume-ftp") > .setHeader("direction", simple("inbound")) > .log(LoggingLevel.DEBUG, "route.ftp-download", "Retrieving file from > FTP: ${file:name}") > .toD(file:// + configuration.getArchiveInbound() + > "/${date:now:yyyy-MM-dd}?flatten=true") > .to(file:// + configuration.getInbound() + "?flatten=true") > .log(LoggingLevel.INFO, "route.ftp-download", "Inbound file archived > and sent to handling: ${file:name}"); > > where, > String uri = "ftps://example.com:1234/download?username=user&password=pw" + > "&ftpClient.keyStore.file=filepath" + > "&ftpClient.keyStore.password=pw" + > "&ftpClient.keyStore.keyPassword=pw" + > "&delete=true" + > "&include=.*\\.xml\\Z" + > "&passiveMode=true" + > "&binary=true" + > "&stepwise=false" + > "&autoCreate=false" + > "&disconnect=true" + > "&maxMessagesPerPoll=100" + > "&maximumReconnectAttempts=3" + > "&reconnectDelay=600000" + > "&scheduler=quartz" + > "&scheduler.cron=0 0/30 * * * ?" + > "&localWorkDirectory=localpath" + > "&preSort=true" + > "&sorter=#fileSorter"; > > I don't know why maximumReconnectAttempts and reconnectDelay were added and > they might be related to the issue since they could keep a filename in > memory. I have now removed those two and added fileExist and moveExisting to > the two producers to avoid losing data. > > > Logs: > The handling of the below logs has led to: > The content of Test11.xml has been replaced by Test6.xml > The content of Test13.xml has been replaced by Test11.xml > The content of Test14.xml has been replaced by Test12.xml > > I did a bit of cleanup to avoid too much repetition: > > 2021-06-17 01:30:00,015 [DEBUG] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.RemoteFileConsumer.connectIfNecessary]: > Exception checking connection status: File operation failed: null Connection > is not open. Code: 221 > 2021-06-17 01:30:00,015 [DEBUG] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.RemoteFileConsumer.connectIfNecessary]: > Not connected/logged in, connecting to: ftps://u...@example.com:1234 > 2021-06-17 01:30:09,312 [DEBUG] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.RemoteFileConsumer.connectIfNecessary]: > Connected and logged in to: ftps://u...@example.com:1234 > 2021-06-17 01:30:09,577 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test1.xml] due to File operation failed: 150 File status > okay; about to open data connection. > Couldn't kickstart handshaking. Code: 150. Caused by: > [org.apache.camel.component.file.GenericFileOperationFailedException - File > operation failed: 150 File status okay; about to open data connection. > Couldn't kickstart handshaking. Code: 150] > org.apache.camel.component.file.GenericFileOperationFailedException: File > operation failed: 150 File status okay; about to open data connection. > Couldn't kickstart handshaking. Code: 150 > at > org.apache.camel.component.file.remote.FtpOperations.retrieveFileToFileInLocalWorkDirectory(FtpOperations.java:629) > at > org.apache.camel.component.file.remote.FtpOperations.retrieveFile(FtpOperations.java:416) > at > org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:435) > at > org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:147) > at > org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:240) > at > org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:201) > at > org.apache.camel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:190) > at > org.apache.camel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:107) > at > org.apache.camel.pollconsumer.quartz.QuartzScheduledPollConsumerJob.execute(QuartzScheduledPollConsumerJob.java:61) > at org.quartz.core.JobRunShell.run(JobRunShell.java:202) > at > org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) > Caused by: javax.net.ssl.SSLException: Couldn't kickstart handshaking > at sun.security.ssl.Alert.createSSLException(Alert.java:127) > at sun.security.ssl.TransportContext.fatal(TransportContext.java:324) > at sun.security.ssl.TransportContext.fatal(TransportContext.java:267) > at > sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:397) > at > org.apache.commons.net.ftp.FTPSClient._openDataConnection_(FTPSClient.java:641) > at > org.apache.commons.net.ftp.FTPClient._retrieveFile(FTPClient.java:1896) > at > org.apache.commons.net.ftp.FTPClient.retrieveFile(FTPClient.java:1882) > at > org.apache.camel.component.file.remote.FtpOperations.retrieveFileToFileInLocalWorkDirectory(FtpOperations.java:602) > ... 10 common frames omitted > Suppressed: java.net.SocketException: Connection reset by peer: > socket write error > at java.net.SocketOutputStream.socketWrite0(Native Method) > at > java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111) > at > java.net.SocketOutputStream.write(SocketOutputStream.java:155) > at > sun.security.ssl.SSLSocketOutputRecord.encodeAlert(SSLSocketOutputRecord.java:81) > at > sun.security.ssl.TransportContext.fatal(TransportContext.java:355) > ... 16 common frames omitted > Caused by: java.net.SocketException: Connection reset by peer: socket write > error > at java.net.SocketOutputStream.socketWrite0(Native Method) > at > java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111) > at java.net.SocketOutputStream.write(SocketOutputStream.java:155) > at > sun.security.ssl.SSLSocketOutputRecord.flush(SSLSocketOutputRecord.java:251) > at > sun.security.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:89) > at > sun.security.ssl.ClientHello$ClientHelloKickstartProducer.produce(ClientHello.java:580) > at sun.security.ssl.SSLHandshake.kickstart(SSLHandshake.java:500) > at > sun.security.ssl.ClientHandshakeContext.kickstart(ClientHandshakeContext.java:107) > at > sun.security.ssl.TransportContext.kickstart(TransportContext.java:231) > at > sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:387) > ... 14 common frames omitted > 2021-06-17 01:35:09,577 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test2.xml] due to File operation failed: Read timed out. > Code: 150. > org.apache.camel.component.file.GenericFileOperationFailedException: File > operation failed: Read timed out. Code: 150 > at > org.apache.camel.component.file.remote.FtpOperations.retrieveFileToFileInLocalWorkDirectory(FtpOperations.java:629) > at > org.apache.camel.component.file.remote.FtpOperations.retrieveFile(FtpOperations.java:416) > at > org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:435) > at > org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:147) > at > org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:240) > at > org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:201) > at > org.apache.camel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:190) > at > org.apache.camel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:107) > at > org.apache.camel.pollconsumer.quartz.QuartzScheduledPollConsumerJob.execute(QuartzScheduledPollConsumerJob.java:61) > at org.quartz.core.JobRunShell.run(JobRunShell.java:202) > at > org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) > Caused by: java.net.SocketTimeoutException: Read timed out > at java.net.SocketInputStream.socketRead0(Native Method) > at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) > at java.net.SocketInputStream.read(SocketInputStream.java:171) > at java.net.SocketInputStream.read(SocketInputStream.java:141) > at > sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:457) > at > sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:68) > at > sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1095) > at sun.security.ssl.SSLSocketImpl.access$200(SSLSocketImpl.java:72) > at > sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:815) > at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) > at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) > at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) > at java.io.InputStreamReader.read(InputStreamReader.java:184) > at java.io.BufferedReader.fill(BufferedReader.java:161) > at java.io.BufferedReader.readLine(BufferedReader.java:324) > at java.io.BufferedReader.readLine(BufferedReader.java:389) > at org.apache.commons.net.ftp.FTP.__getReply(ftp://FTP.java:320) > at org.apache.commons.net.ftp.FTP.__getReply(ftp://FTP.java:299) > at org.apache.commons.net.ftp.FTP.sendCommand(ftp://FTP.java:522) > at > org.apache.commons.net.ftp.FTPSClient.sendCommand(FTPSClient.java:563) > at org.apache.commons.net.ftp.FTP.sendCommand(ftp://FTP.java:644) > at org.apache.commons.net.ftp.FTP.sendCommand(ftp://FTP.java:618) > at org.apache.commons.net.ftp.FTP.pasv(ftp://FTP.java:1041) > at > org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:896) > at > org.apache.commons.net.ftp.FTPSClient._openDataConnection_(FTPSClient.java:622) > at > org.apache.commons.net.ftp.FTPClient._retrieveFile(FTPClient.java:1896) > at > org.apache.commons.net.ftp.FTPClient.retrieveFile(FTPClient.java:1882) > at > org.apache.camel.component.file.remote.FtpOperations.retrieveFileToFileInLocalWorkDirectory(FtpOperations.java:602) > ... 10 common frames omitted > 2021-06-17 01:40:09,577 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test3.xml] due to File operation failed: Read timed out. > Code: 150. > org.apache.camel.component.file.GenericFileOperationFailedException: File > operation failed: Read timed out. Code: 150 > at > org.apache.camel.component.file.remote.FtpOperations.retrieveFileToFileInLocalWorkDirectory(FtpOperations.java:629) > ... > 2021-06-17 01:40:09,671 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test4.xml] due to Cannot retrieve file > org.apache.camel.component.file.GenericFileOperationFailedException: Cannot > retrieve file: RemoteFile[Test4.xml] from: ftps://example.com:1234... > at > org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:457) > at > org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:147) > at > org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:240) > at > org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:201) > at > org.apache.camel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:190) > at > org.apache.camel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:107) > at > org.apache.camel.pollconsumer.quartz.QuartzScheduledPollConsumerJob.execute(QuartzScheduledPollConsumerJob.java:61) > at org.quartz.core.JobRunShell.run(JobRunShell.java:202) > at > org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) > 2021-06-17 01:40:12,718 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test5.xml] due to Cannot retrieve file > org.apache.camel.component.file.GenericFileOperationFailedException: Cannot > retrieve file: RemoteFile[Test5.xml] from: ftps://example.com:1234... > ... > 2021-06-17 01:40:12,718 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test6.xml] due to Cannot retrieve file > org.apache.camel.component.file.GenericFileOperationFailedException: Cannot > retrieve file: RemoteFile[Test6.xml] from: ftps://example.com:1234... > ... > 2021-06-17 01:40:12,734 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test7.xml] due to Cannot retrieve file > org.apache.camel.component.file.GenericFileOperationFailedException: Cannot > retrieve file: RemoteFile[Test7.xml] from: ftps://example.com:1234... > ... > 2021-06-17 01:45:12,749 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test8.xml] due to File operation failed: Read timed out. > Code: 150. > org.apache.camel.component.file.GenericFileOperationFailedException: File > operation failed: Read timed out. Code: 150 > at > org.apache.camel.component.file.remote.FtpOperations.retrieveFileToFileInLocalWorkDirectory(FtpOperations.java:629) > ... > 2021-06-17 01:50:12,749 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test9.xml] due to File operation failed: Read timed out. > Code: 150. > org.apache.camel.component.file.GenericFileOperationFailedException: File > operation failed: Read timed out. Code: 150 > at > org.apache.camel.component.file.remote.FtpOperations.retrieveFileToFileInLocalWorkDirectory(FtpOperations.java:629) > ... > 2021-06-17 01:50:12,827 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test10.xml] due to Cannot retrieve file > org.apache.camel.component.file.GenericFileOperationFailedException: Cannot > retrieve file: RemoteFile[Test10.xml] from: ftps://example.com:1234... > at > org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:457) > ... > 2021-06-17 01:50:22,030 [DEBUG] (DefaultQuartzScheduler-camel-1_Worker-1) > [route.ftp-download]: Retrieving file from FTP: Test11.xml > 2021-06-17 01:50:22,046 [INFO ] (DefaultQuartzScheduler-camel-1_Worker-1) > [route.ftp-download]: Inbound file archived and sent to handling: Test11.xml > 2021-06-17 01:50:22,187 [WARN ] (DefaultQuartzScheduler-camel-1_Worker-1) > [org.apache.camel.component.file.remote.FtpConsumer.log]: Error processing > file RemoteFile[Test12.xml] due to Cannot retrieve file > org.apache.camel.component.file.GenericFileOperationFailedException: Cannot > retrieve file: RemoteFile[Test12.xml] from: ftps://example.com:1234... > at > org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:457) > ... > 2021-06-17 01:50:22,359 [DEBUG] (DefaultQuartzScheduler-camel-1_Worker-1) > [route.ftp-download]: Retrieving file from FTP: Test13.xml.xml > 2021-06-17 01:50:22,359 [INFO ] (DefaultQuartzScheduler-camel-1_Worker-1) > [route.ftp-download]: Inbound file archived and sent to handling: > Test13.xml.xml > 2021-06-17 01:50:22,531 [DEBUG] (DefaultQuartzScheduler-camel-1_Worker-1) > [route.ftp-download]: Retrieving file from FTP: Test14.xml > 2021-06-17 01:50:22,531 [INFO ] (DefaultQuartzScheduler-camel-1_Worker-1) > [route.ftp-download]: Inbound file archived and sent to handling: Test14.xml > > > > Kind regards > > Carsten Bülow -- Claus Ibsen ----------------- http://davsclaus.com @davsclaus Camel in Action 2: https://www.manning.com/ibsen2