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

How to create a custom NiFi Controller Service?

我正在尝试学习如何创建自定义 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 服务,其中 java 文件中的两个我应该复制 DBCPConnectionPool 服务的原始源代码。

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

nifi-DbcpServiceDemo-api下的

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

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

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

示例:

最好的例子是记录reader/writer控制器服务。如果您查看 nifi-record-serialization-services-bundle in nifi, they have different implementation for serializing records of JSON, Grok, avro, CSV data formats but they all are actually implementing one API - nifi-record-serialization-service-api 并且因此对于想要使用 Record ReaderRecord Writer 的处理器,而不是将实际实现作为其依赖项,他们宁愿使用 api作为它的依赖。

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

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