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

Apache Camel File组件filterDirectory参数的作用与使用方法咨询

filterDirectory参数作用

filterDirectory是Apache Camel File组件专为递归目录扫描设计的过滤参数,仅在配置recursive=true时生效,核心逻辑为:递归扫描目录过程中,每遇到一级子目录就会执行你配置的Simple表达式校验,校验通过才会进入该目录扫描内部的子目录和文件,校验不通过则直接跳过整个目录下的所有内容。
该参数的校验规则分两种:

  1. 若Simple表达式输出为字符串:Camel会将输出值与当前单级子目录的名称做等值匹配,匹配成功则校验通过
  2. 若Simple表达式输出为布尔值:直接用布尔结果判断是否通过校验

配置失效原因

你配置的filterDirectory: ${date:now:yyyy/DDD},假设当前为2021年第270天,表达式输出为2021/270,但递归扫描时第一级子目录名称为2020、2021,单级目录名不可能包含/,永远无法和表达式输出匹配。部分低版本Camel遇到字符串不匹配的情况会默认放行目录,就会出现你遇到的所有文件都被扫描的问题。

另外如果删除recursive=true,组件不会扫描任何子目录,而你的起始目录下没有直接存放文件,自然没有文件被处理。

正确使用示例

如果你要实现仅扫描当前年下对应日序的目录(如2021/270),需要先放行年份目录,再放行日序目录,配置如下:

private final Map<String, String> params = Map.of(
  "noop", "true",
  "recursive", "true",
  // 单级目录名等于当前年份 或 等于当前日序时,允许进入该目录
  "filterDirectory", "${header.CamelFileNameOnly} == ${date:now:yyyy} || ${header.CamelFileNameOnly} == ${date:now:DDD}"
);

如果需要更灵活的过滤规则,也可以直接写布尔表达式,比如过滤掉所有名称包含temp的临时目录:

"filterDirectory", "${header.CamelFileNameOnly} not contains 'temp'"

注意事项

  • filterDirectory仅过滤目录,文件过滤需要使用filter、antInclude等专用参数
  • 若需要匹配完整相对路径,可使用${header.CamelFileRelativePath}获取当前目录相对于起始目录的完整路径做判断,但要注意必须先放行父级目录,否则无法进入深层子目录

内容的提问来源于stack exchange,提问作者Andrei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:18:01