Чтение свойств системы NiFi не работает с Groovy - PullRequest
0 голосов
/ 30 мая 2018

В моей системе есть переменная, определенная в файле nifi.properties, которую я пытаюсь прочитать в процессоре ExecuteScript, используя Groovy.Ниже я попробовал:

def flowFile = session.get()
if (!flowFile) return

try
{
def newFile = new File(${config.password.file}).getText()

flowFile = session.putAttribute(flowFile, "passwordFile", newFile.toString())
session.transfer(flowFile, REL_SUCCESS)  
}
catch(Exception e)
{
flowFile = session.putAttribute(flowFile, "errorStack",e.toString())
session.transfer(flowFile, REL_FAILURE)
}

Значение config.password.file - это абсолютный путь к файлу, который содержит пароль, который мне нужно использовать.

Не уверен, но этот подход не работает.Вот стек ошибок, который я получаю:

groovy.lang.MissingPropertyException: No such property: config for class: Script90

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

def filex = "C:\\Users\\myUser\\Desktop\\passwordFile.pass"
String passFile = new File(filex).getText()

Есть идеи, что я пропускаю / делаю неправильно?

Кроме того, исходя из стека ошибок, о котором я упоминал выше, в нем не упоминается, какое именно свойство отсутствует.Кто-нибудь имеет какие-либо идеи о том, как настроить код как таковой, он генерирует ошибку точно, какое свойство отсутствует или что-то подобное?

1 Ответ

0 голосов
/ 30 мая 2018

Быстрый ответ заключается в том, что язык выражений NiFi не поддерживается в теле скрипта или в файле скрипта, предоставленном свойством ExecuteScript, но то, что вы хотите, все еще может быть выполнено.

Как это сделать config.password.fileопределены?Это пользовательское свойство на процессоре ExecuteScript?Если это так, проблема заключается в получении доступа к переменной, содержащей символы, специфичные для Groovy, например точку.Вместо того, чтобы ссылаться на них по имени, вам придется использовать привязку скрипта следующим образом:

def flowFile = session.get()
if (!flowFile) return

try {
  def newFile = new File(binding.getVariable('config.password.file').value).text
  flowFile = session.putAttribute(flowFile, "passwordFile", newFile.toString())
  session.transfer(flowFile, REL_SUCCESS)  
}
catch(e) {
  flowFile = session.putAttribute(flowFile, "errorStack",e.toString())
  session.transfer(flowFile, REL_FAILURE)
}

Если это не свойство, а атрибут файла потока, попробуйте следующее:

def flowFile = session.get()
if (!flowFile) return

try {
  def newFile = new File(flowFile.getAttribute('config.password.file')).text
  flowFile = session.putAttribute(flowFile, "passwordFile", newFile.toString())
  session.transfer(flowFile, REL_SUCCESS)  
}
catch(e) {
  flowFile = session.putAttribute(flowFile, "errorStack",e.toString())
  session.transfer(flowFile, REL_FAILURE)
}

Два сценария отличаются только строкой newFile: первый получает свойство как объект PropertyValue из привязки, связанной со сценарием, а второй получает значение атрибута файла потока.

...