线上问题排查——RabbitMQ消费异常复盘
一、问题现象
有小伙伴反应在啄木鸟后台使用运营号分表管理功能时异常。
这边的一个功能背景是:目前智慧社区的CA、CS等组件的数据库采用分库分表,以运营号(运营号映射一个TableCode编号)为分片键。当需要修改(删除、新增等)所有运营号的表结构时,可以在啄木鸟页面输入运营号、ddl语句等,啄木鸟会调用MC组件去发送RabbitMQ消息到对应的组件,执行DDL语句。
数据链路如下图

我通过日志发现,MC发送往RabbitMQ的消息已正确投递到CS组件,页面也给出如下提示。

查看对应CS组件的日志,发现如下内容

二、问题分析
问题很显然,是字符串转JSON对象时候报错。

奇怪,以前不会报这个错的,通过对比测试环境和开发环境打印的payload内容发现:测试环境的消息内容并没有转义字符,而开发环境确有。
正常的日志:

错误的日志:

**大胆猜测原因:消息的发送方式被改变了。 **
三、寻找根源
这里消息发送方的代码如下:

我们在当前MC组件并没有对RabbitTemplate做特殊定制,使用的是默认配置。
但是,当我打了断点并查看当前类注入的RabbitTemple时,发现已经被重新定义了。如下图。

发现主数据引入了这个框架,现有的发送消息RabbitTemplate类被重新定义,导致和以往消费端接收方式不兼容。

点进源代码发现,RabbitTemplate被重新定义了。MessageConverter使用的是Jackson2JsonMessageConverter,如下图。

RabbitTemplate默认使用SimpleMessageConverter。

四、确定根源
结论:RabbitTemplate中的MessageConverter属性被改变了,原先使用的是默认的SimpleMessageConverter,现在是JacksonMessageConverter。