ScriptedValidateRecord

文档中心 › 组件索引 › ScriptedValidateRecord

ScriptedValidateRecord Processor

类型全限定名:cn.org.acal.lynxus.processors.script.ScriptedValidateRecord

所属 Bundle:cn.org.acal.lynxus:lynxus-scripting-nar:2.11.8

描述

此处理器提供使用用户提供的脚本验证 FlowFile 中记录的能力。

标签

recordvalidatescriptgroovy

属性

下表中,加粗的属性为必填项;其余为可选项。表格同时标注默认值、是否支持表达式语言,以及是否为敏感属性(值会被加密)。

名称默认值可选值描述
Record Reader控制器服务 API:
RecordReaderFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
Record Reader用于将传入的FlowFile解析为记录
Record Writer控制器服务 API:
RecordSetWriterFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
记录转换后用于序列化记录的Record Writer
Script EngineGroovy
  • Clojure
  • 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.countFlowFile中的记录数。
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;
}