You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ü

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:39:01