Apache Camel - doneFileName的工作原理

时间:2018-02-05 14:51:57

标签: apache-camel

source_dir 包含以下文件:ABC_02022018_162301.CSV,ABC_02022018_231801.CSV,controlFile

<route id="Test">
  <from uri="file:source_dir?include=ABC_.*\.CSV&amp;doneFileName=controlFile&amp;delete=true&amp;readLock=changed&amp;readLockTimeout=20000&amp;readLockCheckInterval=5000&amp;eadLockMinLength=0"/>
<log message="${file:name}"/>
**destination directory **
</route>

我在这里看,路由必须检查每个主文件的controlFile。如果任何主文件没有控制文件,主文件不应该从源文件夹移动。

在上面的代码中,camel只检查源文件夹中是否存在控制文件并将所有文件移动到目标文件夹。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

根据Camel docs(部分&#39;使用&#39;完成&#39;文件&#39;),为了在每个主文件中都有一个doneFile,您需要指定动态的doneFile名称:< / p>

  

每个目标文件有一个完成文件更常见。这意味着   有1:1的相关性。要做到这一点,你必须使用动态   doneFileName选项中的占位符。目前Camel支持   以下两个动态标记:file:name和file:name.noext必须   包含在$ {}

如果你没有,那么Camel将使用所有文件,然后删除doneFile,除非noop=true

答案 1 :(得分:0)

简短回答:如果您像这样动态定义doneFileName&#34; doneFileName = $ {file:name.noext} .trig&#34;然后,您要传输的每个文件都必须具有.trig扩展名的副本。 如果你静态定义doneFileName就像&#34; doneFileName = files.trig&#34;然后,当files.trig出现时,每个文件都会被移动。

所以你必须为每个文件考虑一个唯一的doneFileName而不是&#34; controlFile&#34;并动态设置它。最简单的方法是使用实​​际的fileName并添加一些扩展名。

示例:

想象一下这个文件:file1.txt,file2.txt
这条路线来自:

from("ftp://admin@localhost/from?password=admin"
        + "&fileName=${file:name}"
        + "&doneFileName=${file:name.noext}.done")

在这种情况下,只有当file1.done也存在于同一文件夹中时,才会移动file1.txt。仅当file2.done也存在于同一文件夹中时,才会移动file2.txt。

现在想象一下这条路线:

from("ftp://admin@localhost/from?password=admin"
        + "&fileName=${file:name}"
        + "&doneFileName=controlFile");

在这种情况下,当files.done文件出现在同一文件夹中时,将移动文件file1.txt和file2.txt。