Xml 在Apache NiFi的ExecuteScript处理器中缓存文件内容
我有一个ExecuteScript处理器,它对schematron执行XML流文件验证。我希望schematron文件的内容被缓存到某个地方,而不是一次又一次地从磁盘读取每个流文件 这样做的最佳选择是什么?我还需要另一个脚本将schematron的内容放入context.stateManager或PutDistributedMapCache还是什么?我正要回答“否”,但似乎这是可能的。 您可以在ExecuteScript处理器内缓存变量Xml 在Apache NiFi的ExecuteScript处理器中缓存文件内容,xml,apache-nifi,schematron,Xml,Apache Nifi,Schematron,我有一个ExecuteScript处理器,它对schematron执行XML流文件验证。我希望schematron文件的内容被缓存到某个地方,而不是一次又一次地从磁盘读取每个流文件 这样做的最佳选择是什么?我还需要另一个脚本将schematron的内容放入context.stateManager或PutDistributedMapCache还是什么?我正要回答“否”,但似乎这是可能的。 您可以在ExecuteScript处理器内缓存变量 var flowFile = session.get();
var flowFile = session.get();
if (flowFile !== null) {
var x = (x || 0) + 1;
log.error('this is round: ' + x);
session.transfer(flowFile, REL_SUCCESS);
}
总体思路
使用EcmaScript引擎对ExecuteScript处理器使用一个简单的脚本表明,您实际上能够在处理器内存储状态
var flowFile = session.get();
if (flowFile !== null) {
var x = (x || 0) + 1;
log.error('this is round: ' + x);
session.transfer(flowFile, REL_SUCCESS);
}
在处理器内使用此脚本将导致记录以下内容:
...
ExecuteScript[id=...] this is round: 3
ExecuteScript[id=...] this is round: 2
ExecuteScript[id=...] this is round: 1
最多每x时间单位更新一次文件
我使用现有NiFi ValidateXML处理器的基本代码
var flowFile = session.get();
if (flowFile !== null) {
var x = (x || 0) + 1;
log.error('this is round: ' + x);
session.transfer(flowFile, REL_SUCCESS);
}
基本思想是在需要时更新文件
// type definitions
var File = Java.type("java.io.File");
var FileNotFoundException = Java.type("java.io.FileNotFoundException");
var System = Java.type("java.lang.System");
// constants
var SCHEMA_FILE_PATH = "/foo/bar"; // exchange with real path
var timeoutInMillis = 30 * 1000; // 30 seconds
// initialize
var schemaFile = schemaFile || null;
var lastUpdateMillis = lastUpdateMillis || 0;
var flowFile = session.get();
function updateSchemaFile() {
schemaFile = new File(SCHEMA_FILE_PATH);
if (!schemaFile.exists()) {
throw new FileNotFoundException("Schema file not found at specified location: " + schemaFile.getAbsolutePath());
}
lastUpdateMillis = System.currentTimeMillis();
}
if (flowFile !== null) {
var now = System.currentTimeMillis();
var schemaFileShouldBeUpdated = (schemaFile == null) || ((lastUpdateMillis || 0) + timeoutInMillis) < now;
if (schemaFileShouldBeUpdated) {
updateSchemaFile();
}
// TODO Do with the file whatever you want
log.error('was file updated this round? ' + schemaFileShouldBeUpdated + '; last update millis: ' + lastUpdateMillis);
session.transfer(flowFile, REL_SUCCESS);
}
//类型定义
var File=Java.type(“Java.io.File”);
var FileNotFoundException=Java.type(“Java.io.FileNotFoundException”);
var System=Java.type(“Java.lang.System”);
//常数
var SCHEMA_FILE_PATH=“/foo/bar”;//与实路径交换
var timeoutInMillis=30*1000;//30秒
//初始化
var schemaFile=schemaFile | | null;
var lastUpdateMillis=lastUpdateMillis | | 0;
var flowFile=session.get();
函数updateSchemaFile(){
schemaFile=新文件(SCHEMA\u File\u路径);
如果(!schemaFile.exists()){
抛出新的FileNotFoundException(“在指定位置未找到架构文件:“+schemaFile.getAbsolutePath()”);
}
lastUpdateMillis=System.currentTimeMillis();
}
如果(流文件!==null){
var now=System.currentTimeMillis();
var schemaFile应该更新=(schemaFile==null)| |((lastUpdateMillis | | 0)+timeoutInMillis)
免责声明 我无法判断变量是否会被清除,更不用说何时了。检查ExecuteScript处理器中使用的表示定期重新加载脚本文件。我不确定这样做的后果 此外,我还没有尝试使用其他受支持的脚本语言,因为我最熟悉JavaScript。我正要回答“否”,但似乎这是可能的。 您可以在ExecuteScript处理器内缓存变量
var flowFile = session.get();
if (flowFile !== null) {
var x = (x || 0) + 1;
log.error('this is round: ' + x);
session.transfer(flowFile, REL_SUCCESS);
}
总体思路
使用EcmaScript引擎对ExecuteScript处理器使用一个简单的脚本表明,您实际上能够在处理器内存储状态
var flowFile = session.get();
if (flowFile !== null) {
var x = (x || 0) + 1;
log.error('this is round: ' + x);
session.transfer(flowFile, REL_SUCCESS);
}
在处理器内使用此脚本将导致记录以下内容:
...
ExecuteScript[id=...] this is round: 3
ExecuteScript[id=...] this is round: 2
ExecuteScript[id=...] this is round: 1
最多每x时间单位更新一次文件
我使用现有NiFi ValidateXML处理器的基本代码
var flowFile = session.get();
if (flowFile !== null) {
var x = (x || 0) + 1;
log.error('this is round: ' + x);
session.transfer(flowFile, REL_SUCCESS);
}
基本思想是在需要时更新文件
// type definitions
var File = Java.type("java.io.File");
var FileNotFoundException = Java.type("java.io.FileNotFoundException");
var System = Java.type("java.lang.System");
// constants
var SCHEMA_FILE_PATH = "/foo/bar"; // exchange with real path
var timeoutInMillis = 30 * 1000; // 30 seconds
// initialize
var schemaFile = schemaFile || null;
var lastUpdateMillis = lastUpdateMillis || 0;
var flowFile = session.get();
function updateSchemaFile() {
schemaFile = new File(SCHEMA_FILE_PATH);
if (!schemaFile.exists()) {
throw new FileNotFoundException("Schema file not found at specified location: " + schemaFile.getAbsolutePath());
}
lastUpdateMillis = System.currentTimeMillis();
}
if (flowFile !== null) {
var now = System.currentTimeMillis();
var schemaFileShouldBeUpdated = (schemaFile == null) || ((lastUpdateMillis || 0) + timeoutInMillis) < now;
if (schemaFileShouldBeUpdated) {
updateSchemaFile();
}
// TODO Do with the file whatever you want
log.error('was file updated this round? ' + schemaFileShouldBeUpdated + '; last update millis: ' + lastUpdateMillis);
session.transfer(flowFile, REL_SUCCESS);
}
//类型定义
var File=Java.type(“Java.io.File”);
var FileNotFoundException=Java.type(“Java.io.FileNotFoundException”);
var System=Java.type(“Java.lang.System”);
//常数
var SCHEMA_FILE_PATH=“/foo/bar”;//与实路径交换
var timeoutInMillis=30*1000;//30秒
//初始化
var schemaFile=schemaFile | | null;
var lastUpdateMillis=lastUpdateMillis | | 0;
var flowFile=session.get();
函数updateSchemaFile(){
schemaFile=新文件(SCHEMA\u File\u路径);
如果(!schemaFile.exists()){
抛出新的FileNotFoundException(“在指定位置未找到架构文件:“+schemaFile.getAbsolutePath()”);
}
lastUpdateMillis=System.currentTimeMillis();
}
如果(流文件!==null){
var now=System.currentTimeMillis();
var schemaFile应该更新=(schemaFile==null)| |((lastUpdateMillis | | 0)+timeoutInMillis)
免责声明 我无法判断变量是否会被清除,更不用说何时了。检查ExecuteScript处理器中使用的表示定期重新加载脚本文件。我不确定这样做的后果
此外,我还没有尝试使用其他受支持的脚本语言,因为我最熟悉JavaScript。在
groovy
脚本中,可以使用静态变量声明类,因此它们肯定会在处理器启动后保持状态
此外,要管理这些静态变量的初始化,可以使用ExecuteGroovyScript
processor的功能来截取处理器的启动和停止
在下面的示例中,我将把流文件内容与磁盘上的某个文件进行比较,因为我对schematron不熟悉
import org.apache.nifi.processor.ProcessContext
类缓存{
静态字符串验证程序text=null
}
//此函数在处理器启动时调用,因此不能在其中使用流文件
静态void onStart(ProcessContext上下文){