You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:14:55