将rabbitmq升级到v3.11后,它无法启动并显示以下消息:
启动期间出错:{error,not_json}
它与从 3.10 导出的配置相同,通过环境变量加载,该环境变量覆盖自definitions.json
定义初始化脚本 ( #!/bin/sh
) 中的文件。
我们的 docker 镜像基于官方的rabbitmq docker 镜像,并添加了一些小的内容。
将rabbitmq升级到v3.11后,它无法启动并显示以下消息:
启动期间出错:{error,not_json}
它与从 3.10 导出的配置相同,通过环境变量加载,该环境变量覆盖自definitions.json
定义初始化脚本 ( #!/bin/sh
) 中的文件。
我们的 docker 镜像基于官方的rabbitmq docker 镜像,并添加了一些小的内容。
事实证明,底层JSON 解析器在 v3.11 中发生了变化。它性能更高,但也更严格/敏感。根据此讨论,重要的是断言该
definitions.json
文件不包含 BOM 并使用 LF 代替换行符,而不是 CRLF。在我们的例子中,问题完全不同,我们的定义包含带有转义正则表达式的值,例如
"pattern": ".+\\.response\\.queue"
。当回显 (echo $MQ_DEFINITIONS > definitions.json
) 时,echo
将双反斜杠转换\\
为单反斜杠\
,而后跟的单反斜杠.
实际上是无效的 json。我们案例中的解决方案是使用printf "%s" $MQ_DEFINITIONS
替代方案。这将取决于所使用的平台和 shell。