为什么DBCPConnectionPool服务中的ExpressionLanguageScope仅限于'VARIABLE_REGISTRY'而不是'FLOWFILE_ATTRIBUTES'?

Ris*_*sad 2 apache minify hortonworks-data-platform apache-nifi hortonworks-dataflow

所述DBCPConnectionPool Service要求5的连接参数来建立到数据库的连接如图所示在下面的图片 [标记为黄色] 在此输入图像描述

我曾经UpdateAttribute Processor手动添加这5个连接参数并给它们各自的值,如下图所示 [标记为黄色] 在此输入图像描述

现在,当我试图DBCPConnectionPool Service通过这些属性读取连接参数的值时(如下图所示),我无法读取它们. 在此输入图像描述

要知道之所以DBCPConnectionPool Service无法读取Flowfile属性,我继续检查两个源代码DBCPConnectionPool ServiceUpdateAttribute 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/阿帕奇/ 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/处理器/属性/ UpdateAttribute.java

Souce代码DBCPConnectionPool Service: 在此输入图像描述

Souce代码UpdateAttribute Processor: 在此输入图像描述

因此,我开始知道它无法从FlowFile属性中读取值的原因.这是因为ExpressionLanguageScope它受到限制VARIABLE_REGISTRY而不受限制FLOWFILE_ATTRIBUTES.

现在,我的问题是,为什么ExpressionLanguageScopeDBCPConnectionPool Service被限制为VARIABLE_REGISTRY.这种限制的原因是什么?我问这个问题的原因是因为我想通过FlowFile属性读取连接参数的值.

Siv*_*man 5

对于在NiFi开发邮件列表中提出的相同问题,Andy以尽可能最好的方式回答了问题.为什么的原因DBCPConnectionPool与此有关的服务或任何控制器服务,采用ExpressionLanguageScope.VARIABLE_REGISTRY的是,控制器服务有没有到flowfiles访问,所以它不会读flowfiles'属性.对于这个问题,为什么它只支持VARIABLE_REGISTRY:

  • 仅仅因为它不读取流文件属性并不意味着它不应该使用来自其他地方的属性.
  • VARIABLE_REGISTRY引入的一个主要原因是避免暴露敏感值,这是我们传递诸如flowfile属性之类的值时的情况.控制器服务适合这种情况,因为它们中的许多都使用敏感属性Password.

如果你假设你可以让它只是改变这些属性的范围ExpressionLanguageScope.FLOWFILE_ATTRIBUTES,你就错了.更改它们是没有意义的,也不起作用,原因是控制器服务再也无法访问流文件.

如果您有特定的要求,您需要为不同的流文件使用不同的属性值,原始开发线程中的Andy共享了一些我再次发布的链接:

  • 这是对的.有关为什么Controller Services无法访问流文件属性的上下文,一个原因是它们被设计为由许多处理器共享.想象一下,你有一个大流量,10s或100s处理器与同一个DB服务器交互.让它们各自创建自己的连接或连接池是低效的,因此控制器服务的想法是所有需要连接到该数据库服务器的处理器可以共享池.如果连接属性是动态的,由流文件属性驱动,则无法共享连接池. (2认同)