Apache Camel路由配置咨询:如何递归移动Zip文件至保留原目录结构的Processing/Storage目录
保留Zip文件处理时的子目录结构解决方案
当然可以实现!Apache Camel的文件组件配合表达式语言,很轻松就能让processing、storage以及error目录同步保留原importDir下的子目录结构。
核心思路
Camel在处理文件时,会自动捕获文件相对于源目录(也就是你配置的importDir)的相对路径,我们可以直接利用这个路径来构造目标目录的结构,不用手动解析目录层级。
修改后的路由配置
你只需要把原来的preMove、move、moveFailed参数替换成带表达式的形式,使用Camel的文件语言或简单表达式即可:
from("file://importDir?recursive=true&preMove=processing/${file:relative}&move=storage/${file:relative}&moveFailed=error/${file:relative}&include=.*\\.zip$") .bean(bean, "process");
关键表达式说明
${file:relative}:这个表达式会返回当前文件相对于importDir的完整相对路径(包括所有子目录和文件名)。举个例子:- 如果原文件路径是
importDir/docs/2024/report.zip,那么${file:relative}的值就是docs/2024/report.zip - 处理前,文件会被移动到
processing/docs/2024/report.zip - 处理成功后,会移动到
storage/docs/2024/report.zip - 处理失败的话,会移动到
error/docs/2024/report.zip
- 如果原文件路径是
额外注意事项
- 自动创建目录:如果担心目标目录(比如
processing/docs/2024)不存在导致报错,可以在源文件组件参数里加上autoCreate=true,Camel会自动帮你创建所需的子目录:from("file://importDir?recursive=true&autoCreate=true&preMove=processing/${file:relative}&move=storage/${file:relative}&moveFailed=error/${file:relative}&include=.*\\.zip$") .bean(bean, "process"); - 替代表达式:你也可以用
${exchangeProperty.CamelFileRelativePath}来替代${file:relative},二者效果完全一致,因为file:relative本质就是对这个Exchange属性的封装。
这样配置后,你的子目录结构就能完美保留在各个处理目录里了~
内容的提问来源于stack exchange,提问作者Spyse
相关产品推荐
相关产品推荐

