EMQX是否支持动态表名插入数据

环境信息

  • EMQX 版本:4.4.3
  • 操作系统及版本:Linux、CentOS 7.9 、Docker 20.10.9
  • 其他

问题描述

EMQX是否支持动态表名插入数据,如果支持的话应该怎么配置?
目前如果写成动态表名插入TDengine数据库是不成功的。

配置文件及日志

  • 资源:WebHook方式连接TDengine
  • 规则:根据主题生成动态表名
  • 动作:Restful形式插入TDengine数据库
# 规则
SELECT
  clientid,
  concat(payload.group_name, '_123') as tableName
FROM
  'test/#'
# sql模板
INSERT INTO test.${tableName} VALUES (
  now,
  ${current},
  ${voltage},
  ${phase}
)

emqx就是取出数据拼成tdengine需要的body,发给他。得看看日志他返回什么具体错?

目前看你这action里面的content-type是不需要带的,他就不是个json。

似乎跟content-type没有关系,因为之前用确定的表名是可以写入成功的。比如下面的表test_123

INSERT INTO test.test_123 VALUES (
  now,
  ${current},
  ${voltage},
  ${phase}
)

但是用占位符的方式就不行了,所以想问一下,EMQX支不支持 test.${tableName} 这样的动态表名的写法?

应该支持的,你用个debug action看看能不能把tableName打印出来,是不是你没传
payload.group_name。。。

好的,谢谢,我再试试吧。另外还想问一下,规则引擎支不支持遍历json获取键,因为存在很多不同类型的设备,每种设备上传的数据json里属性名是不一样的,insert into test.${tableName} values (now, ${current}, ${voltage}, ${phase})在这种情况下不通用,规则引擎有没有一种方式根据json的属性和值动态生成insert语句?类似下面这样的通用模板

insert into test.${tableName} (${field}) values (${value})

如果规则引擎不支持的话,想实现这样的功能,有没有其他的方案或者建议?

EMQX 5.0 支持使用 jq 来进行复杂的 JSON 处理,这部分文档还在完善中可以试试看:
https://github.com/emqx/emqx-docs/pull/1384

EMQX 4.x 企业版的话,推荐使用编解码功能,相当于扩展 SQL 函数实现想要的处理逻辑

看提供的文档是企业版,是不是只有企业版才有这样的功能?在本地测试用的是4.4.3开源版本,创建资源的下拉选中没有 Parser HTTP,开源版本中有没有支持的SQL语句或者其他替代方案去实现那样的功能?还说只能用代码实现…

是的,编解码仅限企业版。补充一下,也可以尝试 exhook 功能,它可以在 publish 前改写 payload 内容。

感谢您提供的建议,然后去看了官方的文档。不过没有开发过这个,也不了解;
想问一下这两个模块有什么区别?


exhook-svr-java
exproto-svr-java

两个都要启动?还是选择其中一个?