Почему ExpressionLanguageScope в службе DBCPConnectionPool ограничен только "VARIABLE_REGISTRY", а не "FLOWFILE_ATTRIBUTES"?
DBCPConnectionPool Service
требуется 5 параметров соединения для установления соединения с базой данных, как показано на рисунке ниже [Помечено желтым]
я использовал UpdateAttribute Processor
вручную добавить эти 5 параметров подключения и присвоить им соответствующие значения, как показано на рисунке ниже [Помечено желтым]
Теперь, когда я пытался прочитать значения параметров соединения в DBCPConnectionPool Service
через эти атрибуты (показанные на картинке ниже) я не смог их прочитать.
Чтобы узнать причину, почему DBCPConnectionPool Service
не удалось прочитать атрибуты Flowfile, я пошел, чтобы проверить исходный код для обоих DBCPConnectionPool Service
а также UpdateAttribute Processor
,
Код соуса для 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
, ты не прав. Их изменение не имеет смысла и не работает, причина в том, что сервисы контроллера снова не получают доступ к потоковым файлам.
Если для вас существует конкретное требование, согласно которому вам нужно использовать разные значения свойств для разных потоковых файлов, Энди в оригинальной ветке разработки поделился некоторыми ссылками, которые я снова публикую: