37.6. 移动和删除操作
任何移动或删除操作都会在(post 命令)完成后执行;因此,在处理 Exchange 时,该文件仍然位于 inbox 文件夹中。
让我们用一个示例来说明这一点:
from("file://inbox?move=.done").to("bean:handleOrder");
from("file://inbox?move=.done").to("bean:handleOrder");
当文件在 inbox 文件夹中丢弃时,文件使用者会注意到这个内容,并创建一个新的 FileExchange,它被路由到 handleOrder bean。然后,bean 会处理 File 对象。此时,该文件仍然位于 inbox 文件夹中。在 bean 完成后,路由完成,因此文件使用者将执行 move 操作,并将文件移到 .done 子文件夹。
move 和 preMove 选项被视为目录名称(尽管您使用 文件 语言等表达式),则表达式评估的结果是要使用的文件名。https://docs.redhat.com/en/documentation/red_hat_build_of_apache_camel/4.8/html-single/red_hat_build_of_apache_camel_for_spring_boot_reference/index#csb-camel-simple-language-starter例如,如果设置了:
move=../backup/copy-of-${file:name}
move=../backup/copy-of-${file:name}
然后,使用我们使用的文件语言返回要使用的文件名,可以是相对或绝对的。https://docs.redhat.com/en/documentation/red_hat_build_of_apache_camel/4.8/html-single/red_hat_build_of_apache_camel_for_spring_boot_reference/index#csb-camel-file-language-starter如果相对,则目录创建为来自文件的文件夹中的子文件夹,其中使用了该文件。
默认情况下,Camel 会将消耗的文件移到相对于使用文件的目录的 .camel 子文件夹。
如果要在处理后删除该文件,则路由应该是:
from("file://inbox?delete=true").to("bean:handleOrder");
from("file://inbox?delete=true").to("bean:handleOrder");
我们引入了一个新的 预 移动操作,以便在处理文件 之前 移动文件。这样,您可以在处理前标记哪些文件已扫描到这个子文件夹中。
from("file://inbox?preMove=inprogress").to("bean:handleOrder");
from("file://inbox?preMove=inprogress").to("bean:handleOrder");
您可以组合 预 移动和常规移动:
from("file://inbox?preMove=inprogress&move=.done").to("bean:handleOrder");
from("file://inbox?preMove=inprogress&move=.done").to("bean:handleOrder");
因此,在这种情况下,文件在处理后处于 inprogress 文件夹中,它被移到 .done 文件夹。