Apache Camel FTP getting Cannot retrieve file: RemoteFile error

1.6k views Asked by At

I'm trying to retrieve files using the Camel FTP component (Camel 2.19.0):

from("ftp://my.host.com:21/my/relative/directory?download=true&stepwise=false&delete=false")

Camel is connecting and listing the files in the directory correctly, however when it goes to process them, it throws the following exception for each file:

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot retrieve file: RemoteFile[my/relative/directory/file1.txt] from: ftp://my.host.com:21/my/relative/directory?delete=false&download=true&stepwise=false
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:427)
    at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:137)
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:218)
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:182)
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)

From the TRACE logs, I can see that Camel is listing the files in the directory correctly:

[TRACE] 2017-09-05 11:40:49,438 org.apache.camel.component.file.remote.FtpConsumer - Polling directory: my/relative/directory
[TRACE] 2017-09-05 11:40:51,748 org.apache.camel.component.file.remote.FtpOperations - listFiles(my/relative/directory)
[TRACE] 2017-09-05 11:40:58,657 org.apache.camel.component.file.remote.FtpConsumer - Found 3 in directory: my/relative/directory
[TRACE] 2017-09-05 11:40:58,657 org.apache.camel.component.file.remote.FtpConsumer - FtpFile[name=/absolute/path/to/directory/file1.txt, dir=false, file=true]
[TRACE] 2017-09-05 11:40:58,657 org.apache.camel.component.file.remote.FtpConsumer - FtpFile[name=/absolute/path/to/directory/file2.txt, dir=false, file=true]
[TRACE] 2017-09-05 11:40:58,657 org.apache.camel.component.file.remote.FtpConsumer - FtpFile[name=/absolute/path/to/directory/file3.txt, dir=false, file=true]

When Camel tries to process each file however, it appears to be prepending the relative directory to the absolute directory and failing to find the resulting garbled path:

[TRACE] 2017-09-05 11:40:59,417 org.apache.camel.component.file.remote.FtpConsumer - Processing file: RemoteFile[absolute/path/to/directory/file1.txt]
[TRACE] 2017-09-05 11:40:59,418 org.apache.camel.component.file.remote.FtpConsumer - Retrieving file: my/relative/directory//absolute/path/to/directory/file1.txt from: ftp://my.host.com:21/my/relative/directory?delete=false&download=true&stepwise=false
[TRACE] 2017-09-05 11:40:59,418 org.apache.camel.component.file.remote.FtpOperations - retrieveFile(my/relative/directory//absolute/path/to/directory/file1.txt)
[TRACE] 2017-09-05 11:40:59,418 org.apache.camel.component.file.remote.FtpOperations - Client retrieveFile: my/relative/directory//absolute/path/to/directory/file1.txt
[WARN ] 2017-09-05 11:40:59,518 org.apache.camel.component.file.remote.FtpConsumer - Error processing file RemoteFile[absolute/path/to/directory/file1.txt] due to Cannot retrieve file: RemoteFile[absolute/path/to/directory/file1.txt] from: ftp://my.host.com:21/my/relative/directory?delete=false&download=true&stepwise=false

This path in the logs constructed by the FTPComponent is incorrect:

Retrieving file: my/relative/directory//absolute/path/to/directory/file1.txt

I debugged the Camel FTP consumer and it looks like on line 238 is where the relative path is getting prepended to the absolute path

Interestingly enough, the SFTP component is doing the same thing however it is working because RemoteFileOperations<ChannelSftp.LsEntry> does not set filename as an absolute path but RemoteFileOperations<FTPFile> does.

Does anyone have any suggestions to work around this to get the FTP Conponent to consume the files? or am I doing something incorrectly?

I'm using Camel 2.19.0

1

There are 1 answers

1
Sukul Amrit On

By default, camel will go to \home{username}\ directory.
If your file is kept under relative path to this, you only need to give directory path as \abc-any-path\file.txt
If your file is kept at any path other than \home{username}\, then in that case you need to give
\ ..\ ..\abc-any-absolute-path\file.txt

Camel won't allow you to enter absolute path directly. Hope this helps!