You need to enable JavaScript to run this app.
文档中心
消息队列 RocketMQ版

消息队列 RocketMQ版

复制全文
下载 pdf
常见问题
消息发送常见问题
复制全文
下载 pdf
消息发送常见问题
本文介绍消息队列 RocketMQ版在消息发送过程中的常见问题及解决方案。​
SpringBoot 发送 RocketMQ 5.x 顺序消息时报错 TopicMessageType validate failed 如何处理?​
问题描述​
在 SpringBoot 项目中使用 rocketmq-spring-boot-starter 调用 rocketMQTemplate.syncSendOrderly() 发送顺序消息时,客户端明确请求发送顺序(FIFO)消息,服务端却校验消息类型为普通(NORMAL)消息,导致发送失败,并出现如下报错:​
​
o.s.web.servlet.DispatcherServlet : Failed to complete request:​
org.springframework.messaging.MessagingException: CODE: 13​
DESC: TopicMessageType validate failed, the expected type is FIFO,​
but actual type is NORMAL BROKER​
​
问题原因​
  1. 服务端校验机制:RocketMQ 5.x 引入了严格的消息类型校验机制。对于标记为 FIFO(顺序)的 Topic,Broker 会校验每条消息的属性中是否包含 __SHARDINGKEY,只有携带该属性的消息才会被识别为 FIFO 类型,否则将被判定为 NORMAL 普通消息并拒绝写入。​
  1. 客户端协议缺陷:rocketmq-spring-boot-starter 默认使用 Remoting 协议,其底层依赖的 rocketmq-client 在发送顺序消息时,不会自动添加 __SHARDINGKEY 属性。​
  1. 类型匹配失败:即使客户端调用了顺序发送接口,消息因缺少关键标识导致类型匹配失败,Broker 会将其判定为 NORMAL 类型,因为与 FIFO Topic 的类型不一致而拒绝写入,返回 TopicMessageType validate failed 错误。​
解决方案​
  • 方案一:使用 5.x gRPC 协议​
  • gRPC 是 RocketMQ 5.x 标准协议,发送时设置 MessageGroup,由 Proxy 内部将其转换为 __SHARDINGKEY 属性,满足 FIFO 消息校验。​
  • 方案二:手动添加 __SHARDINGKEY 属性​
  • 在保持 Remoting 协议的前提下,发送消息时手动添加 __SHARDINGKEY 属性,使 Broker 能够正确识别顺序消息。​
  • 方案三:创建普通消息类型的 Topic​
  • 使用普通类型的 Topic 发送顺序消息,服务端不会进行严格的消息类型校验,可避免类型不匹配报错。​
  • 方案四:切换至 RocketMQ 4.x 实例与 SDK​
  • 切换至 RocketMQ 4.x 版本的实例,并使用对应的 4.x SDK 收发顺序消息。​
最近更新时间:2026.04.09 15:29:37
这个页面对您有帮助吗?
有用
有用
无用
无用