如何在NiFi自定义处理器中使用DBCPConnectionPool控制器服务并解决打包报错
自定义NiFi处理器调用DBCPConnectionPool的正确配置及报错解决
报错根因
你遇到的打包错误完全是依赖配置错误导致的:
- processors模块错误引入了
nifi-dbcp-service实现包,该包自带NiFi官方的控制器服务实现类,还传递依赖了record sink相关组件,打包时nar插件会扫描所有类生成扩展定义,缺失对应类就触发第一类报错 - 手动补充record sink相关依赖后,nar插件扫描到这些依赖里的控制器服务类但缺少对应的配置项,就触发了空指针报错
- 注释自己写的代码不生效是因为错误来源是第三方依赖包,和你自己的业务代码无关
修复步骤
1. 修正processors模块pom.xml依赖
完全删除nifi-dbcp-service依赖,仅保留接口依赖即可,DBCP服务的实现由NiFi运行环境提供,不需要打包进你的自定义组件:
<dependencies> <dependency> <groupId>org.apache.nifi</groupId> <artifactId>nifi-api</artifactId> <version>1.14.0</version> </dependency> <dependency> <groupId>org.apache.nifi</groupId> <artifactId>nifi-utils</artifactId> <version>1.14.0</version> </dependency> <dependency> <groupId>org.apache.nifi</groupId> <artifactId>nifi-dbcp-service-api</artifactId> <version>1.14.0</version> </dependency> <!-- 原有测试依赖直接保留即可 --> <dependency> <groupId>org.apache.nifi</groupId> <artifactId>nifi-mock</artifactId> <version>1.14.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> </dependencies>
2. 修正DBCP服务属性定义
删除不必要的dynamic(true)配置,控制器服务属性不需要开动态配置:
public static final PropertyDescriptor DBCP_CONNECTION_POOL_SERVICE = new PropertyDescriptor.Builder() .name("DBCPConnectionPool Service") .description("The Controller Service to use in order to establish a connection") .required(true) .identifiesControllerService(DBCPService.class) .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) .build();
3. 修正连接获取逻辑,补充资源释放
获取连接后必须在finally块关闭,避免连接泄漏:
@Override public void onTrigger(ProcessContext context, ProcessSession session) throws ProcessException { DBCPService dbcpService = context.getProperty(DBCP_CONNECTION_POOL_SERVICE) .asControllerService(DBCPService.class); Connection conn = null; try { conn = dbcpService.getConnection(); // 执行你的SQL逻辑 } catch (SQLException e) { throw new ProcessException("获取数据库连接失败", e); } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { // 忽略关闭异常即可 } } } // 后续流文件处理逻辑 }
4. 保留nar模块的pom.xml配置不变
你当前nar模块的依赖配置完全正确,不需要修改。
验证修复
执行mvn clean install即可正常打包,将生成的nar包放入NiFi的lib目录重启后,就能在自定义处理器的配置页选择已创建的DBCPConnectionPool控制器服务。
内容的提问来源于stack exchange,提问作者vigneshwar
相关产品推荐
相关产品推荐

