ScriptedValidateRecord Processor
描述
此处理器提供使用用户提供的脚本验证 FlowFile 中记录的能力。
标签
属性
| 名称 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
| Record Reader | | 控制器服务 API:RecordReaderFactorycn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | Record Reader用于将传入的FlowFile解析为记录 |
| Record Writer | | 控制器服务 API:RecordSetWriterFactorycn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | 记录转换后用于序列化记录的Record Writer |
| Script Engine | Groovy |
| 用于执行脚本的语言引擎 |
| Script Body | | 要执行的脚本主体。 只能使用脚本文件或脚本体之一 | |
| Script File | | 要执行的脚本文件的路径。 只能使用脚本文件或脚本体之一 支持表达式语言:是(仅使用环境/系统变量求值) | |
| Module Directory | | 以逗号分隔的文件和/或目录的路径列表,其中包含脚本所需的模块。 支持表达式语言:是(仅使用环境/系统变量求值) |
关系 (Relationships)
| 名称 | 描述 | 自动终止 |
|---|---|---|
failure | 如果在处理传入FlowFile期间出现任何问题,传入FlowFile将被路由到此关系。 | 否 |
invalid | 包含传入 FlowFile 中无效记录的 FlowFile 将被路由到此关系。如果没有无效记录,则不会有 FlowFile 被路由到此关系。 | 否 |
original | 成功处理后,传入的 FlowFile 将被转移到此关系。无论 FlowFile 是否可能路由到「valid」和「invalid」关系,都会发生这种情况。 | 否 |
valid | 包含传入 FlowFile 中有效记录的 FlowFile 将被路由到此关系。如果没有有效记录,则不会有 FlowFile 被路由到此关系。 | 否 |
写入的 FlowFile 属性
| 名称 | 描述 |
|---|---|
mime.type | 将 mime.type 属性设置为Record Writer指定的 MIME 类型 |
record.count | FlowFile中的记录数。 |
record.error.message | 此属性在失败时提供读取器或写入器遇到的错误消息。 |
状态管理
该组件不存储状态。
受限 (Restricted)
该组件不受限。
输入要求
该组件要求有传入连接。
详细说明
ScriptedValidateRecord
说明
ScriptedValidateRecord Processor 提供了使用脚本语言(例如 Groovy 或 Jython)验证传入 FlowFile 中记录的能力。所提供的脚本 会对传入 FlowFile 中的每条记录求值。每条记录随后会被路由到 "valid" 或 "invalid" FlowFile。因此,每个传入 FlowFile 可能被 拆分为两个独立的 FlowFile(根据脚本,部分记录有效、部分无效), 也可能所有记录保持在单个 FlowFile 中,整体路由到 "valid" 或 "invalid"(根据脚本,全部记录有效或全部无效)。
该 Processor 期望由用户定义的脚本来决定记录是否有效。编写脚本时 需要注意,与 ExecuteScript 不同,该 Processor 不允许脚本本身 暴露可配置的属性或定义 Relationship。
对于传入 FlowFile 中遇到的每条记录,所提供的脚本都会被求值一次。
每次调用脚本时,期望它返回一个 boolean 值,用于判断给定记录
是否有效:脚本返回 true 的记录被视为有效,会被包含在路由到
valid Relationship 的输出 FlowFile 中。返回 false 的记录会被
添加到路由到 invalid Relationship 的 FlowFile 中。无论传入
记录数量多少,输出记录都会被批量处理。对于一个传入
FlowFile,路由到 valid 和 invalid Relationship 的
FlowFile 各最多一个。如果不存在有效或无效记录,对应
Relationship 上不会转移 FlowFile。此外,传入 FlowFile
会不做修改地转移到 original Relationship。如果脚本返回的
对象不被视为 boolean,传入 FlowFile 会改为路由到
failure Relationship,且不会有 FlowFile 被路由到 valid
或 invalid Relationship。
该 Processor 维护一个计数器:"Records Processed",表示 Processor 处理的记录数量。
变量绑定
虽然提供给该 Processor 的脚本不需要提供样板代码或实现任何 类/接口,但它需要某种方式来访问记录和其他所需信息。这通过 变量绑定实现。每次调用脚本时,以下每个变量都会提供给脚本:
| 变量名 | 说明 | 变量类型 |
|---|---|---|
| record | 要处理的记录。 | Record |
| recordIndex | 记录在 FlowFile 中从 0 开始的索引。 | Long(64 位带符号整数) |
| log | Processor 的日志器。写入该日志器的任何内容都会写入日志,就好像 Processor 自己记录的一样。此外,写入该日志器的任何日志消息都会创建一条公告(bulletin)(默认情况下,Processor 会隐藏级别低于 WARN 的公告)。 | ComponentLog |
| attributes | FlowFile Attribute 的键/值对 Map。该 Map 的键和值都是 String 类型。该 Map 是不可变的,任何修改尝试都会抛出 UnsupportedOperationException。 | java.util.Map |
返回值
每次调用脚本时,期望它返回一个 boolean 值。除 boolean 之外的
返回值(包括 null 值)都会被视为意外的脚本行为并相应处理:处理
会被中断,传入 FlowFile 会被转移到 failure Relationship,
不再继续执行。
脚本示例
基于位置验证
以下脚本只把前 2 条记录视为有效。
输入示例(CSV):
company, numberOfTrains Boston & Maine Railroad, 3 Chesapeake & Ohio Railroad, 2 Pennsylvania Railroad, 4 Reading Railroad, 2
输出示例(CSV)- valid Relationship:
company, numberOfTrains Boston & Maine Railroad, 3 Chesapeake & Ohio Railroad, 2
输出示例(CSV)- invalid Relationship:
company, numberOfTrains Pennsylvania Railroad, 4 Reading Railroad, 2
脚本示例(Groovy):
return recordIndex < 2 ? true : false
基于记录内容验证
以下脚本会根据记录内容进行验证。满足条件的记录会成为路由到
valid Relationship 的 FlowFile 的一部分,其余记录会被路由到
invalid Relationship。
输入示例(JSON):
[
{
"company": "Boston & Maine Railroad",
"numberOfTrains": 3
},
{
"company": "Chesapeake & Ohio Railroad",
"numberOfTrains": -1
},
{
"company": "Pennsylvania Railroad",
"numberOfTrains": 2
},
{
"company": "Reading Railroad",
"numberOfTrains": 4
}
]
输出示例(JSON)- valid Relationship:
[
{
"company": "Boston & Maine Railroad",
"numberOfTrains": 3
},
{
"company": "Pennsylvania Railroad",
"numberOfTrains": 2
},
{
"company": "Reading Railroad",
"numberOfTrains": 4
}
]
输出示例(JSON)- invalid Relationship:
[
{
"company": "Chesapeake & Ohio Railroad",
"numberOfTrains": -1
}
]
脚本示例(Groovy):
if (record.getValue("numberOfTrains").toInteger() >= 0) {
return true;
} else {
return false;
}