如何创建自定义NiFi控制器服务?

时间:2018-04-17 08:10:41

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

我正在努力学习如何创建自定义NiFi控制器服务。首先,我想通过简单地复制DBCPConnectionPool服务的原始源代码来模仿DBCPConnectionPool控制器服务。为了实现这一点,我从“nifi- service -bundle-archetype”生成了一个maven原型,并获得了以下项目结构 enter image description here

然而,当我从'nifi- 处理器 -bundle-archetype生成原型时,我得到以下结构: - enter image description here

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

  1. StandardMyService.java位于nifi-DbcpServiceDemo文件夹

  2. MyService.java位于nifi-DbcpServiceDemo-api文件夹

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

    请从头开始指导我,创建与DBCPConnectionPool服务相当的自定义服务时需要遵循的步骤。

1 个答案:

答案 0 :(得分:5)

MyService.java下的{p> nifi-DbcpServiceDemo-api是由StandardMyService.java nifi-DbcpServiceDemo下的nifi-DbcpServiceDemo-api实施的界面。完成实现后,您必须使用StandardMyServiceTwo作为处理器包中的依赖项,该处理器包需要使用此自定义控制器服务。

以这种方式实现控制器服务的原因是:

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

示例:

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

所以明天你可以在record-serialization-services-bundle中添加一个新的实现来获取新的数据格式,而不会触及处理器包上的任何内容。

有关参考资料,请查看以下链接,以帮助您从头开始编写自定义控制器服务