2013-03-08 93 views
1

我已经定义了以下骆驼路线:Apache的骆驼:SFTP:下载的文件多次

RouteBuilder rb = new RouteBuilder() { 
     @Override 
     public void configure() throws Exception { 
      from("sftp://myhost//path/to/files/") 
      .to("log:loggingCategory?level=INFO") 
      .to("file:///tmp/"); 
     } 
    }; 

当我开始使用这条路线骆驼不连接上下文并将其下载的文件。我的问题是骆驼重复下载相同的文件,直到上下文关闭。为什么FTP2组件会这样做,我该如何阻止它?

我已经通过Maven包含了camel-core和camel-ftp的2.10.4版本。

回答

3

Indempotent Consumer有窍门。 the FTP2 component的文档参考the File2 component“因为所有选项也适用于此组件”。有一个参数“indempotent =真”激活的LRUCache的用法:

选项使用幂等消费EIP模式让骆驼跳过 已处理的文件。默认情况下会使用基于内存的LRUCache ,其中包含1000个条目。如果noop = true,那么idempotent将启用 以避免重复使用相同的文件。

我的完整源定义现在看起来是这样的:

from("sftp://myhost//path/to/files/?username=user&password=secret&idempotent=true") 
+2

你是对的,使用idempotent选项可以解决你的问题。请记住设置基于文件的idempotentrepository选项或自定义选项,否则最终会在重新启动或文件数超过1000时出现相同的问题。 – techuser 2013-03-10 15:21:46

1

从骆驼FTP2文档:

的FTP用户将默认离开 远程FTP服务器不变消耗文件。你必须明确地配置它,如果你想 它删除文件或将它们移动到另一个位置。例如, 可以使用delete = true来删除文件,或使用move = .done将文件移动到隐藏完成子目录。

要删除的文件,路径更改为

from("sftp://myhost//path/to/files?delete=true") 

确保连接的用户所需的权限。

+0

感谢您的评论,但我不希望删除源文件。我的意图是骆驼从sftp源复制所有文件然后停止,所以我想在Unix上实现一个递归拷贝,如'cp -r',但是通过SFTP。我现在已经找到了解决方案,我会在这里发布答案。 – mdo 2013-03-09 08:19:40