NiFi中通过ExecuteGroovyScript调用Redis命令及报错问题求助
解决方案
你遇到的报错核心原因是:直接通过ID获取到的控制器服务是通用ControllerService类型,没有显式转换为RedisConnectionPoolService类型,Groovy运行时无法识别getConnection()方法,所以抛出方法不存在的异常。
实现步骤
- 第一步(推荐):在ExecuteGroovyScript处理器的配置页面,添加一个自定义动态属性,命名为
redisConnectionPool,属性值选择你已经启用的RedisConnectionPoolService控制器服务,避免硬写服务ID。 - 第二步:使用如下Groovy脚本完成LPUSH操作,可根据需求扩展其他Redis命令:
// 导入依赖类 import org.apache.nifi.redis.RedisConnectionPoolService import org.springframework.data.redis.connection.RedisConnection // 获取Redis连接池服务(动态属性绑定方式,无需硬写ID) def redisService = redisConnectionPool as RedisConnectionPoolService // 如果一定要用ID获取,替换为下面这行即可: // def redisService = context.controllerServiceLookup.getControllerService("2b841623-35ed-1e1a-0a77-46087267939d") as RedisConnectionPoolService // 从连接池获取连接,执行完操作后自动释放连接 redisService.connection.withCloseable { RedisConnection redis -> // 执行LPUSH命令,所有键值参数都需要转为字节数组 def pushCount = redis.listCommands().lPush("test_list".getBytes(), "测试内容".getBytes()) log.info("成功向test_list插入{}条数据", pushCount) } // 流文件流转逻辑(如果需要处理流文件可保留) def flowFile = session.get() if (!flowFile) return session.transfer(flowFile, REL_SUCCESS)
其他常用Redis命令示例
- 执行STRING类型SET命令:
redis.stringCommands().set("test_key".getBytes(), "test_value".getBytes())
- 执行STRING类型GET命令:
def value = new String(redis.stringCommands().get("test_key".getBytes()))
- 执行HASH类型HSET命令:
redis.hashCommands().hSet("test_hash".getBytes(), "field1".getBytes(), "value1".getBytes())
注意事项
- 确保
RedisConnectionPoolService配置正确、处于启用状态,且拥有目标Redis实例的访问权限 - 所有Redis的键、值参数都需要转换为字节数组,读取返回值时如果是字符串需要手动指定编码转换
- 生产环境不建议硬写控制器服务ID,使用动态属性绑定的方式更易维护
内容的提问来源于stack exchange,提问作者Cemre Mengü
相关产品推荐
相关产品推荐

