首页 文章

NiFi定制处理器表达语言

提问于
浏览
0

我正在尝试在Apache NiFi中创建一个自定义处理器,它可以将属性/字符串添加到流文件内容中的JSON对象 . 目前它只是在我使用字符串时工作,但是当我使用NiFi的表达式语言时它不起作用,尽管我的代码支持它 .

表达式语言100%正确,因为它在另一个处理器中工作,我也尝试了不同的属性,以确保它不是属性 .

property :

public static final PropertyDescriptor ADD_ATTRIBUTE = new PropertyDescriptor
        .Builder().name("Add Attribute")
        .description("Example Property")
        .required(true)
        .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
        .expressionLanguageSupported(true)
        .build();

稍后在我的代码中,当我想获取值并放入我使用的JSON对象时:

jsonObject.put("hostname", context.getProperty(ADD_ATTRIBUTE).evaluateAttributeExpressions().getValue());

我也做了一个单元测试,当我给testrunner.setProperty分配一个文本值时,它可以工作 . 但是,我不知道如何为testrunner分配属性或如何在测试中使用表达式语言 .

提前感谢任何建议或解决方案!

2 回答

  • 4

    我会把这个答案来自Hortonworks Community Connection这里也是FWIW:

    如果表达式引用流文件上的属性,则需要将对流文件的引用传递给evaluateAttributeExpressions:

    FlowFile flowFile = session.get();
    jsonObject.put("hostname", context.getProperty(ADD_ATTRIBUTE).evaluateAttributeExpressions(flowFile).getValue());
    

    如果属性包含属性名称(而不是包含属性名称的Expression),并且您需要流文件中的值:

    jsonObject.put("hostname", flowFile.getAttribute(context.getProperty(ADD_ATTRIBUTE).getValue()));
    

    如果属性值本身包含表达式语言,并且您想要对其进行评估,请查看以下类:

    org.apache.nifi.attribute.expression.language.Query
    
  • 1

    关于测试......

    假设您正在针对传入的FlowFile(evaluateAttributeExpressions(flowFile))评估表达式语言,那么您可以执行以下操作:

    runner.setProperty(ADD_ATTRIBUTE, "${my.attribute}");

    然后创建一个包含my.attribute的属性Map:

    final Map<String,String> attributes = new HashMap<>(); attributes.put("my.attribute", myAttribute);

    然后用属性排列一些内容:

    runner.enqueue(fileIn, attributes); runner.run();

    代码库中的一个例子:

    https://github.com/apache/nifi/blob/1e56de9521e4bc0752b419ffc7d62e096db1c389/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/test/java/org/apache/nifi/processors/solr/TestPutSolrContentStream.java#L243

相关问题