Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在Apache NiFi的ExecuteScript处理器中缓存文件内容_Xml_Apache Nifi_Schematron - Fatal编程技术网

Xml 在Apache NiFi的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();

我有一个ExecuteScript处理器,它对schematron执行XML流文件验证。我希望schematron文件的内容被缓存到某个地方,而不是一次又一次地从磁盘读取每个流文件

这样做的最佳选择是什么?我还需要另一个脚本将schematron的内容放入context.stateManager或PutDistributedMapCache还是什么?

我正要回答“否”,但似乎这是可能的。 您可以在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);
}
基本思想是在需要时更新文件

  • 它还没有被设定或设定
  • 自上次更新以来,至少已过x个时间单位
  • 下面的代码将实现这一点,其中SCHEMA\u FILE\u PATH是指向架构文件的路径。在这种情况下,x是30秒:

    // 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);
    }
    
    基本思想是在需要时更新文件

  • 它还没有被设定或设定
  • 自上次更新以来,至少已过x个时间单位
  • 下面的代码将实现这一点,其中SCHEMA\u FILE\u PATH是指向架构文件的路径。在这种情况下,x是30秒:

    // 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上下文){