升级RabbitMQ到3.11版本后启动失败,报错{error,not_json}
遇到这个问题我太感同身受了!之前帮团队排查过一模一样的情况,咱们从几个核心方向入手排查解决:
先确认导出的配置文件本身格式是否合规
RabbitMQ 3.11对JSON格式的校验比3.10严格很多,之前版本能容忍的小问题(比如末尾多余的逗号、引号不规范)在3.11里直接会触发解析失败。你可以用jq . definitions.json命令在本地校验文件格式,如果有语法错误,jq会直接给出具体的错误位置和原因,非常好用。检查环境变量传递配置的过程是否出了问题
你是用环境变量覆盖definitions.json的,这个过程很容易出现转义错误:比如换行符被吃掉、引号被意外转义,导致最终写入文件的JSON结构被破坏。可以先把环境变量里的内容导出到临时文件验证:echo "$YOUR_DEFINITIONS_ENV_VAR" > temp_def.json,然后用jq检查这个临时文件的格式,就能判断是不是传递环节出了问题。如果是Docker环境,还要注意环境变量的写法,避免双引号嵌套导致的冲突。排查自定义init脚本的写入逻辑
看看你的init脚本里是怎么把环境变量内容写入definitions.json的?比如用echo命令的时候有没有加-e参数处理转义字符?或者是不是用了错误的重定向方式?可以在脚本里加一句调试命令:cat /path/to/definitions.json | jq .,在启动RabbitMQ之前先验证文件格式,这样能快速定位是脚本写入的问题还是配置本身的问题。尝试重新导出适配3.11的配置
如果上面的方法都没解决,不如换个思路:启动一个临时的RabbitMQ 3.11容器,手动把原来3.10的配置还原进去,然后从这个3.11实例里重新导出definitions.json。这样导出的配置完全符合3.11的格式要求,替换掉原来的配置后再启动,大概率能解决问题。
备注:内容来源于stack exchange,提问作者stoft

