如何在Apache Camel单路由中复制文件前删除SFTP目标目录已有文件?
Apache Camel单路由实现SFTP传输前清空目标目录
完全可以实现,下面提供两种常用的单路由实现方案:
方案一:利用SFTP组件原生删除参数
直接在路由开头通过toD调用SFTP组件的删除操作,清空目标目录后再执行文件传输:
from("sftp://sourceUser@sourceHost/sourceDir?password=sourcePass&delay=30000") // 清空目标目录下所有文件(仅当前目录,不包含子目录) .toD("sftp://targetUser@targetHost/targetDir?password=targetPass&delete=true&fileName=*") // 传输当前文件至目标目录 .to("sftp://targetUser@targetHost/targetDir?password=targetPass");
注意事项:
- 如果需要递归删除子目录下的文件,可添加
recursive=true参数,但需谨慎操作避免误删非预期内容 - 确保SFTP账号拥有目标目录的删除权限
- 此方式为批量删除,性能优于逐文件删除
方案二:自定义处理器实现灵活删除逻辑
通过process处理器编写自定义逻辑,可针对特定文件类型、文件名进行删除,适配更复杂的场景:
from("sftp://sourceUser@sourceHost/sourceDir?password=sourcePass&delay=30000") .process(exchange -> { SftpEndpoint targetEndpoint = exchange.getContext() .getEndpoint("sftp://targetUser@targetHost/targetDir?password=targetPass", SftpEndpoint.class); SftpOperations sftpOps = targetEndpoint.getSftpOperations(); try { sftpOps.start(); // 列出目标目录下的所有文件与目录 List<RemoteFile<?>> remoteFiles = sftpOps.listFiles("."); for (RemoteFile<?> file : remoteFiles) { // 仅删除文件,跳过目录 if (!file.isDirectory()) { sftpOps.deleteFile(file.getPath()); } } } finally { sftpOps.stop(); } }) .to("sftp://targetUser@targetHost/targetDir?password=targetPass");
额外优化建议:
- 添加
onException捕获删除过程中的异常(如目录不存在、权限不足等),避免中断文件传输流程 - 结合
idempotentConsumer实现幂等性,防止重复触发路由时重复执行删除操作
内容的提问来源于stack exchange,提问作者Ravi Shakya
相关产品推荐
相关产品推荐

