Почему ExpressionLanguageScope в службе DBCPConnectionPool ограничен только "VARIABLE_REGISTRY", а не "FLOWFILE_ATTRIBUTES"?

DBCPConnectionPool Service требуется 5 параметров соединения для установления соединения с базой данных, как показано на рисунке ниже [Помечено желтым]

я использовал UpdateAttribute Processor вручную добавить эти 5 параметров подключения и присвоить им соответствующие значения, как показано на рисунке ниже [Помечено желтым]

Теперь, когда я пытался прочитать значения параметров соединения в DBCPConnectionPool Service через эти атрибуты (показанные на картинке ниже) я не смог их прочитать.

Чтобы узнать причину, почему DBCPConnectionPool Service не удалось прочитать атрибуты Flowfile, я пошел, чтобы проверить исходный код для обоих DBCPConnectionPool Service а также UpdateAttribute Processor ,

https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/main/java/org/apache/nifi/dbcp/DBCPConnectionPool.java

https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-processor/src/main/java/org/apache/nifi/processors/attributes/UpdateAttribute.java

Код соуса для DBCPConnectionPool Service:

Код соуса для UpdateAttribute Processor:

Таким образом, я узнал причину, по которой он не смог прочитать значения из атрибутов FlowFile. Это потому что ExpressionLanguageScope ограничено VARIABLE_REGISTRY и не FLOWFILE_ATTRIBUTES,

Теперь мой вопрос заключается в том, почему ExpressionLanguageScope за DBCPConnectionPool Service ограничено VARIABLE_REGISTRY , В чем причина этого ограничения? Причина, по которой я задаю этот вопрос, заключается в том, что я хочу прочитать значения параметров соединения через атрибуты FlowFile.

1 ответ

Решение

На тот же вопрос, который был задан в списке рассылки разработчиков NiFi, Энди ответил на него наилучшим образом. Причина по которой DBCPConnectionPool услуги или любые услуги контроллера по этому вопросу, использует ExpressionLanguageScope.VARIABLE_REGISTRY в том, что службы контроллера не имеют доступа к потоковым файлам, поэтому они не будут читать атрибуты потоковых файлов. И на вопрос, почему это только поддерживает VARIABLE_REGISTRY является:

  • Тот факт, что он не читает атрибуты потокового файла, не означает, что он не должен использовать атрибуты из других источников.
  • Одна из основных причин, почему VARIABLE_REGISTRY Был введен, чтобы избежать раскрытия чувствительных значений, что имеет место, когда мы передаем такие значения как атрибуты потока файла. Службы контроллера соответствуют этому случаю, потому что многие из них используют чувствительные свойства, такие как Password,

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

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

Другие вопросы по тегам