2016-03-11 2 views
0

Я пытаюсь создать собственный процессор в Apache NiFi, который может добавить атрибут/строку в объект JSON в содержимом потока. На данный момент это работает, когда я просто использую строку, но она не работает, когда я использую язык выражения NiFi, хотя я поддерживаю его в своем коде.Язык программирования пользовательского процессора NiFi

Язык выражения на 100% правильный, поскольку он работает в другом процессоре, и я также пробовал разные атрибуты, чтобы убедиться, что это не атрибут.

Свойство:

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()); 

Я также сделал Unit Test, и это работает когда я назначаю текстовое значение testrunner.setProperty. Однако я не знаю, как я могу назначить атрибут testrunner или как я могу использовать язык выражения в своем тесте.

Заранее благодарим за любые предложения или решение!

+0

Что возвращаемое значение вы получаете от " context.getProperty (ADD_ATTRIBUTE) .evaluateAttributeExpressions(). ПолучитьЗначение() "? –

+0

Вам нужно что-либо из входного файла потока при оценке вашего выражения? Если это так, обязательно передайте файл потока в вызов valuAttributeExpressions(). –

+0

Привет, возвращаемое значение является пустой строкой, когда я использую язык выражения.Когда я просто использую обычную строку, например, просто «test», тогда возвращаемое значение «test». Мне ничего не нужно, но я также попробовал это, чтобы убедиться, что он сделал что-то, но это не так. – Matthias

ответ

4

Я надену свой ответ от Hortonworks Community Connection здесь слишком FWIW:

Если выражение относится к атрибутам на файл потока, то вам нужно передать ссылку на файл потока в evaluateAttributeExpressions:

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

Если свойство содержит имя атрибута (а не выражение, содержащее имя атрибута), и вы хотите получить значение из файла потока:

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

Если значение атрибута само содержит Expression Language, и вы хотите, чтобы оценить его, обратите внимание на следующий класс:

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

Что касается тестирования ...

Предполагая, что вы оцениваете язык выражений против Incoming FlowFile (evaluateAttributeExpressions (flowFile)), то вы можете сделать следующее:

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

затем создайте атрибут Map, который имеет my.attribute в нем:

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

Смежные вопросы