如何在NiFi中不使用ExecuteScript处理器实现文件存在性检查?
问题核心
需求为事件触发式(响应上游FlowFile)的文件存在检查,仅使用NiFi内置预制处理器(排除自定义代码类处理器如ExecuteScript),无需实际写入文件,且需区分「文件已存在」与「权限不足/NFS不可达等操作失败」两种场景,当前使用NiFi 1.18.0,同时希望了解其他版本的支持情况。
分版本解决方案
1. NiFi 1.18.0及更早版本(无专用处理器,需组合实现)
此版本无专门的事件触发式文件存在检查处理器,可通过现有处理器组合实现需求,且无需写入文件:
组合方案:FetchFile + RouteOnAttribute
FetchFile处理器配置:- 配置
File Path为目标检查路径(支持表达式语言,如/target/storage/${filename}) - 启用公告级别,将
Success关系路由至「文件已存在」分支(可直接丢弃FlowFile或标记状态),Failure关系接入RouteOnAttribute
- 配置
RouteOnAttribute处理器配置:- 新增路由规则
FileNotExists:判断条件为${fetchfile.error.message:contains('does not exist')},路由至后续存储逻辑(如PutFile) - 剩余失败流量默认路由至「操作失败」分支,触发公告(如
Notify处理器)
- 新增路由规则
注:需根据NiFi实际返回的错误文本调整
contains的匹配内容,不同小版本的错误提示可能略有差异。
2. NiFi 1.20.0及以上版本:CheckFileExists处理器
NiFi 1.20.0新增了CheckFileExists处理器,完美匹配需求:
- 支持接收上游FlowFile,通过表达式语言指定待检查的文件路径
- 原生提供三个关系:
exists:文件存在时的流量分支does not exist:文件不存在时的流量分支failure:因权限不足、路径不可访问等操作异常导致的失败分支
- 无需额外处理错误消息,直接通过关系区分场景,完全满足事件触发、不写入文件的要求
针对具体场景的落地(NiFi 1.18.0)
用户场景:仅当指定路径不存在对应文件名的文件时,才存储FlowFile内容,仅在操作失败时触发公告。
流程实现:
- 上游FlowFile进入
FetchFile,配置目标检查路径,分流「文件存在」与「失败」流量 - 失败流量进入
RouteOnAttribute,拆分「文件不存在」与「操作失败」分支 - 「文件不存在」分支接入
PutFile执行存储逻辑 - 「操作失败」分支接入公告类处理器(如
PutEmail/Notify)触发告警
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

