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

Why the ExpressionLanguageScope in DBCPConnectionPool service is limited to only 'VARIABLE_REGISTRY' and not ' FLOWFILE_ATTRIBUTES'?

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/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.

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

对于 NiFi dev mailing list 中提出的相同问题,Andy 已以最佳方式回答。 DBCPConnectionPool 服务或任何控制器服务使用 ExpressionLanguageScope.VARIABLE_REGISTRY 的原因是,控制器服务 没有 访问流文件的权限,因此它不会读取流文件的属性。而对于问题,为什么它只支持VARIABLE_REGISTRY是:

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

如果您假设只需将这些属性的范围更改为 ExpressionLanguageScope.FLOWFILE_ATTRIBUTES 就可以使其正常工作,那您就错了。更改它们毫无意义且不起作用,原因再次是控制器服务永远无法访问流文件。

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