我正在努力学习如何创建自定义NiFi控制器服务。首先,我想通过简单地复制DBCPConnectionPool
服务的原始源代码来模仿DBCPConnectionPool
控制器服务。为了实现这一点,我从“nifi- service -bundle-archetype”生成了一个maven原型,并获得了以下项目结构
然而,当我从'nifi- 处理器 -bundle-archetype生成原型时,我得到以下结构: -
我理解,在处理器的情况下,我只需要在MyProceesor.java
目录下的nifi-ListDbTableDemo-processors
中编写我的代码,然后从中创建一个nar文件。但是在控制器服务的情况下,我生成了4个文件夹。我可以看到两个java文件,即
StandardMyService.java
位于nifi-DbcpServiceDemo
文件夹
MyService.java
位于nifi-DbcpServiceDemo-api
文件夹
现在,为什么在自定义控制器服务的情况下会生成两个java文件,而在自定义处理器的情况下只生成一个java文件。此外,由于我正在尝试模仿DBCPConnectionPool
服务,我应该在其中复制DBCPConnectionPool
服务的原始源代码中的两个java文件。
请从头开始指导我,创建与DBCPConnectionPool
服务相当的自定义服务时需要遵循的步骤。
答案 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 Writer
或Top2
,而不是将实际实现作为其依赖,他们宁可将api作为其依赖。
所以明天你可以在record-serialization-services-bundle中添加一个新的实现来获取新的数据格式,而不会触及处理器包上的任何内容。
有关参考资料,请查看以下链接,以帮助您从头开始编写自定义控制器服务