具有标准控制器服务参考的 NiFi 自定义控制器服务可能吗?

NiFi custom controller service that has standard controller service reference possible?

总的来说,我对 NiFi 比较陌生。我正在开发自定义控制器服务。我还在我的流程中设置了一个 cassandra 连接提供程序控制器服务。

我的问题是,如何从我的自定义控制器服务中的现有 cassandra 连接提供程序获取会话作为 属性(或其他),以便我可以使用连接到 write/run 查询来自我的自定义控制器服务?

我构建了一些可以编译的东西,我认为它可以工作,但还不够。

在我的自定义控制器服务的 pom 中,我添加了依赖项:

        <dependency>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-cassandra-services-api</artifactId>
            <version>1.13.2</version>
        </dependency>

这允许我将 属性 描述符添加到我的自定义控制器服务:

  public static final PropertyDescriptor CONNECTION_PROVIDER_SERVICE = new PropertyDescriptor.Builder()
      .name("cassandra-connection-provider")
      .displayName("Cassandra Connection Provider")
      .description("Specifies the Cassandra connection providing controller service.")
      .required(true)
      .identifiesControllerService(CassandraSessionProviderService.class)
      .build();

当我将自定义控制器服务添加到我的流程时,属性 在那里但为空。它没有将我现有的 cassandra 连接提供程序显示为一个选项,我也无法创建一个。它只是说:“找不到适用于此 属性 的控制器服务类型。”

我怀疑这个问题与我的自定义控制器服务 属性 想要 CassandraSessionProviderService.class 来自我的项目有关,而不是 nifi 包中已经存在的那个,因为 [= 上的工具提示=30=] 说它希望它来自我的项目,而现有的来自 nifi-cassandra-services 项目。即使我在 nifi-cassandra-services 模块上添加了第二个依赖项,它也允许我创建连接提供程序服务,但它是我项目中的一个版本,而不是标准版本,所以它不起作用,因为它不再适用标准处理器。

我想这是一个普遍的问题,是否可能,如果可以,我将如何正确设置依赖项以在自定义控制器服务中使用标准控制器服务包?

我想我已经明白了。添加 -api 依赖项就足够了,因为它是一个接口,允许编译并且需要如上所述。但是您还必须在自定义控制器服务的 -api-nar 模块中具有 -api-nar 依赖项。

像这样:

        <dependency>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-cassandra-services-api-nar</artifactId>
            <version>1.13.2</version>
            <type>nar</type>
        </dependency>

nar pom 可能已经对 nifi-standard-services-api-nar 有一个 nar 依赖,当你编译时会出现一个错误,说你只能有一个 nar 依赖。这是由于 nar 层次结构要求。可以在这里阅读更多内容:https://github.com/apache/nifi/blob/main/nifi-docs/src/main/asciidoc/developer-guide.adoc 如果有兴趣(它在底部。)

但基本上我认为这意味着您摆脱了 nifi-standard-services-api-nar 依赖,转而支持 nifi-cassandra-services-api-nar,因为 cassandra nar 已经引用了标准服务 nar。因此,您通过添加 cassandra 服务包作为 nar 依赖项来创建父子层次结构。然后应该编译并允许在自定义控制器服务中引用 cassandra 连接服务。