Создание пользовательского процессора в Apache Nifi

#apache-nifi

#apache-nifi

Вопрос:

Я создаю пользовательский процессор для обработки файла flow, для обработки файла flow мне нужно прочитать файл CSV из моей локальной файловой системы. Я создал дескриптор proerty CSV_PATH следующим образом

 public static final PropertyDescriptor CSV_PATH = new 
PropertyDescriptor
.Builder().name("CSV Path")
.displayName("CSV Path")
.description("CSV Path Reader")
.required(true)
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
.build();



@Override

protected void init(final ProcessorInitializationContext context) {

final List<PropertyDescriptor> descriptors = new 
ArrayList<PropertyDescriptor>();

descriptors.add(JSON_PATH);

descriptors.add(CSV_PATH);

this.descriptors = Collections.unmodifiableList(descriptors);



final Set<Relationship> relationships = new HashSet<Relationship>();

relationships.add(SUCCESS);

this.relationships = Collections.unmodifiableSet(relationships);

}
  

Теперь я хочу получить значение свойства CSV_PATH, установленного в пользовательском интерфейсе при настройке процессора. Я не могу получить значение CSV_PATH. Также, если я жестко закодирую путь к файлу в коде, я все равно не смогу прочитать CSV из локальной файловой системы.

Ответ №1:

Вы хотите использовать следующий код для извлечения значения PropertyDescriptor из ProcessContext :

 @Override
public void onTrigger(final ProcessContext context, final ProcessSession session) {
    FlowFile flowFile = session.get();
    if (flowFile == null) {
        return;
    }

    final String csvPath = context.getProperty(CSV_PATH).getValue();

    // Do something with csvPath

}
  

Если вы решите поддерживать язык выражений NiFi в этом дескрипторе свойства, вы также захотите выполнить оценку для этого:

final String csvPath = context.getProperty(CSV_PATH).evaluateAttributeExpressions().getValue();

Для этого существуют дополнительные переопределения методов, включая атрибуты flowfile, реестр переменных, пользовательские декораторы и т.д.

Это задокументировано в Руководстве разработчика Apache NiFi. Недавно я сделал презентацию на Dataworks Summit Barcelona 2019, посвященную разработке пользовательских процессоров, включив в нее некоторые лучшие практики и примеры, которые могут оказаться полезными. Вы также можете посмотреть на любой существующий процессор в кодовой базе NiFi, чтобы увидеть примеры.