NiFi-1.0.0 - 加载 lua 脚本

Posted

技术标签:

【中文标题】NiFi-1.0.0 - 加载 lua 脚本【英文标题】:NiFi-1.0.0 - load lua script 【发布时间】:2017-03-08 17:17:12 【问题描述】:

我有一个 NiFi 处理器,它使用 redislabs/luascript 库来加载 lua 脚本并在 redis 实例上执行它。

问题是我不知道将 lua 脚本放在哪里才能使用 luascript 库加载它。我已经把它放到了 nifi_proc/src/main/resources/lua/name.lua,但是我得到了一个 IOException。

我有一个用于连接 redis 的 nifi 控制器服务和一个使用该服务的处理器。

我的项目结构: . ├── nifi-bundle-nar │   └── target ├── nifi-redis_cservice │   ├── src │   └── target ├── nifi-redis_cservice-api │   ├── src │   └── target ├── nifi-redis_cservice-api-nar │   └── target ├── nifi-redis_cservice-nar │   └── target ├── redis-processors │   ├── src │   └── target └── target └── maven-shared-archive-resources

有什么想法吗?

【问题讨论】:

哪些模块引入了 LuaScript 依赖项? 【参考方案1】:

您能否分享有关处理器如何与库交互的更多信息?您是在传递 InputStream、调用可执行文件等吗?

确保您的资源位于处理器项目的 JAR 模块中,而不是处理器的 NAR 模块或父模块(包括两者)。您应该能够从处理器的 JAR 文件中的 Class 对象(例如处理器类本身)中使用 getResourceAsStream("lua/name.lua") 。我不确定你之后需要做什么,是否可以分享源代码或更多细节?

EDIT(回复下面的cmets):fromResource() 使用LuaScript's classloader 获取资源,不知它是否无权访问nifi-proc 或控制器服务资源。看起来,除非用户需要指定脚本的位置,否则控制器服务应该加载到 Lua 脚本中。因此,另一种方法是使用控制器服务类来获取 ResourceAsStream,将整个内容读入 String,然后使用 fromSource 而不是 fromResource。

【讨论】:

我实际上还有一个 nifi 控制器服务,以及一个使用该服务连接到 redis 实例的 nifi-proc。我已将 /lua/myscript.lua 放在 service 和 proc 资源文件夹中。我有一个方法可以将 lua 脚本加载到 redis 中并管理哈希。然后我想在给定一些键/参数的情况下执行 lua 脚本。 luascript lib: github.com/RedisLabs/luascript 加载方法:private LuaScript lua(String fpath, String redis_uri) throws IOException try ls = LuaScript.fromResource(fpath, redis_uri); catch(IOException ie) throw ie; return ls;

以上是关于NiFi-1.0.0 - 加载 lua 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Lua 脚本是不是在执行前加载到内存中?

无法将 Lua 脚本加载到 NodeMCU:无效的 node.chipid()

ESP8266 LUA脚本语言开发: 准备工作-LUA文件加载与变量调用

加载lua脚本的热更新探测

StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改

是否可以将 Lua 脚本修改为要求?