我是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"
任何人都知道我做错了什么?
答案 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管理的,因此本地文件会在处理完成后自动删除。