Csv file2和ftp2之间的骆驼流拆分器行为不同

Csv file2和ftp2之间的骆驼流拆分器行为不同,csv,apache-camel,sftp,Csv,Apache Camel,Sftp,我是个新手,网上没有类似的问题,这让我觉得我在做一些傻事。我正在使用camel 2.12.1组件,正在解析本地目录中的大型CSV文件,并通过SFTP下载它们。我发现了 拆分(body().tokenize(“\n”)).streaming().unmarshal().csv() 适用于本地文件(windows 7);我和一个朋友进行了多次交流 名单 对于csv文件中的每一行。但是,当我从sftp组件(连接到linux服务器下载文件)使用相同的路由语法时,我得到一个带有一行代码的单一交换,读起来像

我是个新手,网上没有类似的问题,这让我觉得我在做一些傻事。我正在使用camel 2.12.1组件,正在解析本地目录中的大型CSV文件,并通过SFTP下载它们。我发现了

拆分(body().tokenize(“\n”)).streaming().unmarshal().csv()

适用于本地文件(windows 7);我和一个朋友进行了多次交流

名单

对于csv文件中的每一行。但是,当我从sftp组件(连接到linux服务器下载文件)使用相同的路由语法时,我得到一个带有一行代码的单一交换,读起来像是对“ls”的调用:

-rwxrwx 1用户名用户名83400 Dec 16 14:11 fileName.csv

经过反复试验,我发现

拆分(正文()).streaming().unmarshal().csv()

使用sftp组件将正确加载和解析文件,但它不会在流模式下执行,而是在将整个文件解组到单个exchange之前将其加载到内存中

我在camel 2.10中发现了一个类似的bug报告(),该子句关闭为无效,表明报告器错误地使用了thread和parallel-with-stream,但我没有配置这两种功能

sftp节im使用的是:

sftp://192.168.1.1?fileName=fileName.csv&username=userName&password=secret!&idempotent=true&localWorkDirectory=tmp
文件节是:

"file:test/data?noop=true&fileName=fileName.csv"

有人知道我做错了什么吗

找到解决问题的中间路线

    <route id="StagingFtpFileCopy">
        <from uri="ftp://{{uriFtpPath}}"/>
        <to uri="file://data/staging"/>
    </route>

我在使用SFTP(骆驼2.25.0)时也遇到了同样的问题。但是,在将路由拆分为两个不同的路由(如其他人所建议的)之前,我使用了下面的url

sftp://:22/?username=random&password=random&delay=2000&move=archive&readLock=changed&bridgeErrorHandler=true&recursive=false&disconnect=true&stepwise=false&streamDownload=true&localWorkDirectory=C:/temp

根据我下面的路线定义

from("sftp url").split().tokenize("\n", 10, true).streaming().to("log:out")
由于此路由还将远程文件下载到本地(与2路由选项相同),然后使用正常流处理本地文件(如Sinsanator所述,它与文件完美配合),因此在下载时内存占用会变成真正的锯齿形(高达100MB)然后它在处理过程中使用了高达150MB的内存,但又是锯齿状的


这种方法的一个优点(在我看来)是,我们可以根据实际的处理完成情况(如果我们中断路由,这是不可能自动完成的),处理与完成相关的任务(例如,将远程文件移动到其他目录)。此外,由于下载由Camel管理,本地文件在处理完成后会自动删除。

我不知道如何正确修复此问题。我们通过将(ftp、http)所有文件资源下载到缓冲区目录中,然后使用文件组件对内容进行流式处理、拆分和并行处理来解决这个问题。然后,从文件路由开始,我们是否为某个特定文件进行投票或将其推送到我们手中也无关紧要。谢谢Ralf,很高兴知道其他人也有类似的问题。我曾想过要走你走的路,但我想更好地理解为什么它首先发生。也许将下载和处理解耦会有好处的另一个原因是FTP组件是单线程的。如果您将下载和处理分离,那么您可以在下载下一个文件时开始处理。这是一个有效的观察结果,公平地说,我发布的代码使用localWorkingDirectory,但对于我的实际用例,我处理的是许多非常大的日志文件,因此,将它们从远程位置流式传输而不是复制到本地目录将减少我的磁盘存储需求,并且我可以通过启动更多的sftp会话来扩大规模。。。您是否可以通过装载远程站点,然后使用file2组件来传输日志文件?我没有使用SSHFS的经验,更不用说结合使用文件组件了。所以我不确定你能从中获得多少里程。