【问题标题】:How to create a custom NiFi Controller Service?如何创建自定义 NiFi 控制器服务?
【发布时间】:2018-04-17 08:10:40
【问题描述】:

我正在尝试学习如何创建自定义 NiFi 控制器服务。一开始,我想通过简单地复制DBCPConnectionPool 服务的原始源代码来模仿DBCPConnectionPool 控制器服务。为了实现相同的功能,我从“nifi-service-bundle-archetype”生成了一个 maven 原型,并获得了以下项目结构

但是,当我从 'nifi-processor-bundle-archetype 生成原型时,我得到了以下结构:-

我知道,如果是处理器,我只需将我的代码写在nifi-ListDbTableDemo-processors 文件夹下的MyProceesor.java 中,然后从中创建一个 nar 文件。但在控制器服务的情况下,我生成了 4 个文件夹。我可以看到两个 java 文件,即

  1. StandardMyService.java 存在于nifi-DbcpServiceDemo 文件夹下

  2. MyService.java 存在于nifi-DbcpServiceDemo-api文件夹下

现在,为什么在自定义控制器服务的情况下会生成两个java文件,而在自定义处理器的情况下只生成一个java文件。另外,由于我试图模仿DBCPConnectionPool服务,我应该将DBCPConnectionPool服务的原始源代码复制到其中的两个java文件中。

请从头开始指导我,创建与DBCPConnectionPool 服务等效的自定义服务所需遵循的步骤。

【问题讨论】:

    标签: apache minify apache-nifi hortonworks-data-platform hortonworks-dataflow


    【解决方案1】:

    nifi-DbcpServiceDemo-api下的MyService.java是由nifi-DbcpServiceDemo下的StandardMyService.java实现的接口。实现完成后,您必须使用 nifi-DbcpServiceDemo-api 作为处理器捆绑包中的依赖项,该依赖包需要与此自定义控制器服务一起使用。

    控制器服务之所以这样实现的原因是:

    • 我们将对处理器捆绑包隐藏实际实现,因为它不需要依赖于实现。
    • 明天你编写一个新的控制器服务实现,比如StandardMyServiceTwo,它再次实现MyService,因为只有实现与StandardMyService不同,其他成员保持不变并且可以共享。这种新的控制器服务可以透明地引入,而无需对处理器包进行任何更改。

    示例:

    最好的例子是记录读取器/写入器控制器服务。如果您查看 nifi 中的 nifi-record-serialization-services-bundle,它们有不同的实现来序列化 JSON、Grok、avro、CSV 数据格式的记录,但它们实际上都在实现一个 API - nifi-record-serialization-service-api 因此对于想要使用的处理器Record Reader 或 Record Writer,而不是将实际实现作为其依赖项,而是将 api 作为其依赖项。

    所以明天您可以在 record-serialization-services-bundle 中为新的数据格式添加一个新的实现,而无需触及处理器包上的任何内容。

    供您参考,请查看以下链接,这将有助于您从头开始编写自定义控制器服务

    【讨论】:

    • 我收到一个错误。 导入 org.apache.nifi.expression.ExpressionLanguageScope; 无法解析。我已经尝试过使用这个依赖 mvnrepository.com/artifact/org.apache.nifi/… 但错误没有解决
    • ExpressionLanguageScope 实际上在master 中。它在 NiFi 1.6.0 或以前的库中不可用。您使用哪个版本作为依赖项?
    • 1.5.0
    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 2020-06-02
    • 2021-09-21
    • 1970-01-01
    • 2019-05-06
    • 2018-05-27
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多