如何用Apache Camel实现SFTP与本地CSV仅追加变更数据同步?
Apache Camel SFTP增量同步CSV文件(追加而非覆盖)
要实现仅追加源CSV文件的增量数据到本地,需要从写入端的追加配置和读取端的增量读取两方面调整:
1. 本地文件写入开启追加模式
默认file组件会覆盖已存在的文件,只需在to端点添加fileExist=Append参数,即可让目标文件存在时自动追加内容:
.to("file:location_dir?fileExist=Append")
2. SFTP端实现增量读取(核心)
如果仅配置追加写入,SFTP默认仍会每次读取整个文件,导致本地文件重复追加全量内容。需开启SFTP的tail模式,让Camel像tail -f命令一样监控文件新增内容,仅传输增量部分:
完整路由示例
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("sftp://user@address/location?password=password&tail=true&delay=3000&tailTrackingFile=/path/to/your/track-file.track") .to("file:location_dir?fileExist=Append"); } }
参数说明:
tail=true:开启tail模式,仅读取文件新增的内容delay=3000:设置轮询间隔(单位毫秒,这里是3秒),可根据业务需求调整tailTrackingFile=/path/to/your/track-file.track:保存读取位置的跟踪文件,重启Camel后可从上次中断的位置继续读取,避免从头开始
额外调整(可选)
如果第一次运行时不想读取文件历史内容,仅监控后续新增数据,添加tailInitialDelay=-1参数:
from("sftp://user@address/location?password=password&tail=true&delay=3000&tailTrackingFile=/path/to/your/track-file.track&tailInitialDelay=-1")
特殊场景处理
如果源CSV文件不是持续追加,而是定期编辑修改(比如手动新增行后保存),tail模式可能不适用。这种情况下可以结合idempotentConsumer和文件修改时间过滤,或自定义处理器对比本地与远程文件的内容差异,但实现相对复杂,优先推荐tail模式用于持续追加的文件场景。
内容的提问来源于stack exchange,提问作者Ulil Kamal
相关产品推荐
相关产品推荐

