Apache Camel FTP获取无法检索文件:RemoteFile错误

时间:2017-09-05 16:32:07

标签: java apache-camel apache-servicemix camel-ftp

我正在尝试使用Camel FTP组件(Camel 2.19.0)检索文件:

    def on_data (self , data):
        try:
            tweet = json.loads(data)['text']
            tweet = data.split(',"text":"')[1].split('","source')[0]
            savefile = str(time.time()) + "::" + tweet
            save = open('twitterDB4.csv', 'a')
            save.write(savefile)
            save.write("\n\n")
            save.close()
            return (True)

        except KeyError:
            pass

Camel正在连接并正确列出目录中的文件,但是当它处理它们时,它会为每个文件抛出以下异常:

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

从TRACE日志中,我可以看到Camel正确列出了目录中的文件:

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)

当Camel尝试处理每个文件时,它似乎是将相对目录添加到绝对目录并且无法找到生成的乱码路径:

[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]

FTPComponent构造的日志中的此路径不正确:

  

检索文件:   我/相对/目录//绝对/路径/到/目录/ FILE1.TXT

我调试了Camel FTP使用者,它看起来像on line 238 is where the relative path is getting prepended to the absolute path

有趣的是,the SFTP component is doing the same thing但是它有效,因为[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 没有将文件名设置为绝对路径,但RemoteFileOperations<ChannelSftp.LsEntry>确实如此。

有没有人有任何建议可以解决这个问题,让FTP Conponent使用这些文件?或者我做错了什么?

我正在使用Camel 2.19.0

1 个答案:

答案 0 :(得分:0)

默认情况下,camel将转到\ home {username} \目录 如果您的文件保存在相对路径下,则只需将目录路径指定为\ abc-any-path \ file.txt
如果你的文件保存在\ home {username} \以外的任何路径,那么在这种情况下你需要给\ .. \ .. \ abc-any-absolute-path \ file.txt

Camel不允许您直接输入绝对路径。希望这有帮助!