刚开始做的时候去翻了好半天nifi的源码,没太搞清自定义Processor怎么使用Service作为属性,后来发现其实nifi对Processor的拓展提供了丰富的API,完全不需要像源码中那样使用,下面是使用方法,关于如何创建自定义Processor工程的文章网上有不少,都还不错,这里主要讲Service的使用,本例子用了数据库访问相关的Service:
首先要添加两个依赖:
1.相关接口api依赖:
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-dbcp-service-api</artifactId>
<version>1.9.2</version>
<scope>provided</scope>
</dependency>
该依赖因为有<scope>provided</scope>所以只有在测试和编译的时候使用,而不会打包进项目里,如需其他相关的Service则需要去maven上输入nifi搜索,本例中使用的是关系型数据库相关依赖,如果只添加该依赖可以打包成功,但是丢到nifi上的时候不能正常运行,会报错找不到Service相关包,为此找了好久,终于在一个外国网站上找到解决办法,需要再添加如下依赖。
2.Service实例依赖:
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-standard-services-api-nar</artifactId>
<version>1.9.2</version>
<type>nar</type>
</dependency>
添加该依赖后自定义Processor就可以使用Service作为属性了,但如果只添加该依赖不添加相关接口api的话则无法通过编译。
然后在项目中添加Service类型属性:
public static final PropertyDescriptor DBCP_SERVICE = new PropertyDescriptor.Builder()
.name("Database Connection Pooling Service")
.description("用于数据库连接的服务")
.required(true)
.identifiesControllerService(DBCPService.class)
.build();
其中.identifiesControllerService(DBCPService.class)确定了Service的类型,本例中使用的是关系型数据库的连接Service
最后在void onTrigger()方法中使用该属性:
DBCPService dbcpService = context.getProperty(DBCP_SERVICE).asControllerService(DBCPService.class);
Connection connection = dbcpService.getConnection();
关系型数据库连接Service提供了getConnection方法来获取相关链接,完成上述步骤之后使用mvn clean install命令打包将打包好的nar进行部署,效果如下: