Camel流分路器在file2和ftp2之间的行为不同

时间:2013-12-20 15:46:22

标签: csv apache-camel sftp

我是Camel的新手,网上缺少类似的问题让我相信我做的事情很傻。我正在使用camel 2.12.1组件,并从本地目录解析大型CSV文件,并通过SFTP下载它们。我发现了

split(body()。tokenize(“\ n”))。streaming()。unmarshal()。csv()

适用于本地文件(Windows 7);我用

进行多次交流

列表与LT;列表与LT;字符串>>

表示csv文件中的每一行。但是,当我从sftp组件使用相同的路由语法(连接到Linux服务器以下载文件)时,我得到一个单行的交换,其内容类似于对“ls”的调用:

-rwxrwxrwx 1 userName userName 83400 12月16日14:11 fileName.csv

通过反复试验,我找到了

split(body())。streaming()。unmarshal()。csv()

使用sftp组件将正确加载和解析文件,但它不会在流模式下执行,它会将整个文件加载到内存中,然后再将其解组为单个交换。

我在camel 2.10中发现了一个类似的错误报告(https://issues.apache.org/jira/browse/CAMEL-6231),其中Clause关闭为无效,表明记者正在使用线程并且与流并行错误,但我没有配置这些功能。

使用的sftp节是:

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

文件节是:

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

任何人都知道我做错了什么?

2 个答案:

答案 0 :(得分:0)

制定中间路线来解决问题。

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

答案 1 :(得分:0)

SFTP(Camel 2.25.0)也面临着同样的问题。但是,在将路由分为2条不同的路由(由其他人提议)之前,我使用了以下网址

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管理的,因此本地文件会在处理完成后自动删除。