消息模型转换概览
当采用消息队列与媒体服务进行对接时,集成系统与媒体服务之间的数据模型通常存在较大的差异,因此也面临这些消息与集成系统的数据模型之间的适配问题。
而消息模型的适配问题,主要存在于指令、指令应答这两个模型中(其他消息,一般在集成系统中并没有对应的概念,因此也不存在适配问题),针对这两个模型,
媒体服务从 4.0 开始,针对term-cmd
和 cmd-state-chg
两个队列,提供基于JSON数据格式 和 JavaScript 脚本的消息转换机制,为集成企业的消息适配提供便利。
如果企业应用本身已在使用消息队列,并且消息数据使用的也是 JSON 格式,则可以利用本文所述的消息模型转换机制来进行消息转换。如果这个条件不满足,
则需要企业应用另行开发消息模型的转换了。
基本工作方式
消息模型转换的调用过程如下:
- 媒体服务加载执行消息转换的 JavaScript 脚本文件,脚本文件中要导出(export)
convertTermCmd
和getAckInfo
两个函数 - 当媒体服务要下发指令时,会将
TermCmd
消息模型转成字符串,并为参数 调用convertTermCmd
函数,然后从convertTermCmd
得到转换后的企业应用自身格式的消息,再将消息term-cmd
队列投递指令消息 - 企业应用从
term-cmd
队列获得自己格式的消息并通过网关编码下发到终端 - 当指令应答时,企业应用将自已格式的消息投递到
cmd-state-chg
,媒体服务收到消息后,会将消息转换成字符串,并作为参数调用getAckInfo
函数,然后从getAckInfo
得到转换后的AckInfo
,AckInfo
包含了媒体服务需要的应答的相关信息
消息模型转换只用于指令、指令应答的消息模型转换。
启用消息模型转换
- 编写 一个JavaScript 的消息转换脚本文件(module),放置到 服务程序的
config/script
目录下,文件名应使用只由字母数字组成的文件名,以.mjs
为文件扩展名,如e-eye.mjs
,文件名(e-eye
)在配置文件要引用到。 - 修改
config/config.json
配置文件定义一个 adaptor 配置,如:
{
"mq": {
"adaptor": {
"script": "e-eye",
"logEnabled": true
}
}
}
其中,mq.adaptor.script
是脚本文件的文件名(不包括 .mjs
扩展名),将mq.adaptor.logEnabled
设置为 true
则脚本文件中调用 console.log() 会输出到媒体服务的日志文件,用于辅助调试。
- 然后将
mq.termCmd.useAdaptor
,和mq.cmdStateChanged.useAdaptor
设置为true
,如:
{
"mq": {
"termCmd": {
"channel": "rabbit",
"destination": "term-cmd",
"useAdaptor": true
},
"cmdStateChange": {
"channel": "rabbit",
"destination": "cmd-state-change",
"useAdaptor": true
}
}
}
当启用消息队列模型转换后,服务启动时会检查脚本文件是否存在,语法是否正确,并且是否已经导出 convertTermCmd
和 getAckInfo
两个函数。