从FTP复制大文件时重复执行出现内容覆盖问题求助
解决Camel FTP重复下载覆盖本地文件的问题
核心原因
默认配置下,Camel FTP组件每次执行都会拉取服务器上的目标文件,不管本地是否已存在,直接覆盖。你之前尝试的.done扩展名如果用错了配置逻辑,自然起不到效果。
可行解决方案
方案1:服务器端移走已下载文件(彻底避免重复拉取)
在FTP的from URI中添加move参数,下载完成后将服务器上的源文件移动到指定目录(比如.done子目录),这样下次路由执行时就不会再拉取该文件。
修改后的路由配置:
<route id="ftp"> <from uri="ftp://xxx@myftp.com/ftp-test/?password=mypassword&move=.done/${file:name}"/> <to uri="file://filepath/temp"/> </route>
- 效果:下载后服务器上的
xxx.txt会被移到ftp-test/.done/xxx.txt,后续路由执行不会再处理这个文件,本地也就不会被覆盖。
方案2:本地保存时自动重命名(保留多次下载版本)
如果需要保留每次下载的文件副本,给本地文件名添加时间戳或唯一标识,确保文件名不重复。
修改后的路由配置:
<route id="ftp"> <from uri="ftp://xxx@myftp.com/ftp-test/?password=mypassword"/> <to uri="file://filepath/temp?fileName=${file:name.noext}-${date:now:yyyyMMddHHmmssSSS}${file:ext}"/> </route>
- 效果:比如原文件是
data.zip,下载后会变成data-20240520143025123.zip,每次文件名都唯一,不会覆盖旧文件。
方案3:用幂等仓库记录已下载文件(适合不能修改服务器文件的场景)
如果无法修改FTP服务器上的文件结构,可通过本地幂等仓库记录已下载的文件名,跳过重复文件。
先定义幂等仓库Bean:
<bean id="ftpIdempotentRepo" class="org.apache.camel.processor.idempotent.FileIdempotentRepository"> <property name="fileStore" value="本地路径/ftp-idempotent-repo"/> </bean>
再修改路由:
<route id="ftp"> <from uri="ftp://xxx@myftp.com/ftp-test/?password=mypassword&idempotent=true&idempotentRepository=#ftpIdempotentRepo"/> <to uri="file://filepath/temp"/> </route>
- 效果:路由会自动记录已下载的文件名,下次执行时跳过已处理过的文件,不会重复下载覆盖。
关于.done扩展名的正确用法
你之前尝试的.done如果是想标记文件已处理,需要注意:
- FTP组件的
doneFileName参数是等待服务器上出现对应.done文件才开始下载源文件(比如要下载data.zip,需要服务器上先有data.zip.done),不是用来标记本地文件。 - 如果要在本地生成
.done标记文件,可通过onCompletion实现,但这不能解决重复下载覆盖的问题,只是做标记用:
<route id="ftp"> <from uri="ftp://xxx@myftp.com/ftp-test/?password=mypassword"/> <to uri="file://filepath/temp"/> <onCompletion> <setHeader headerName="CamelFileName"> <simple>${file:name}.done</simple> </setHeader> <to uri="file://filepath/temp"/> </onCompletion> </route>
内容的提问来源于stack exchange,提问作者b4718
相关产品推荐
相关产品推荐

