RocketMQ 一个topic 多个消费者只有一个消费的问题
2020-08-25 本文已影响0人
索性流年
前言
- 很多时候,我们会在多个地方同时订阅一个 topic,但是发现消费者只能执行一个
- 后注册消费者会顶替之前注册的消费者
原因
- 在
subscribeTable
和subscriptionInner
方法中,是使用 Map 集合的方式存储topic订阅者 - 存储格式
大概
为{group : topic}
- Map 的特性就是 Key 不能重复,所以相同的 Key 会直接替换
解决方法
- 更改
subscribeTable
和subscriptionInner
方法存储的 Key - 也就是创建多个消费组,同时订阅一个topic
案例
- 消费者1 yml 配置
rocketmq:
name-server: 192.168.112.140:9876
producer:
group: member_synchronization_group
- 消费者 1 实现消费
@Service
@RocketMQMessageListener(topic = "mysql-redis-topic", consumerGroup = "member_synchronization_group")
public class MemberListener implements RocketMQListener<String> {
@Autowired
private RedisUtil redisUtil;
@Override
public void onMessage(String message) {
System.out.println("接收消息:" + message);
}
}
- 消费者 2 yml 配置
rocketmq:
name-server: 192.168.112.140:9876
producer:
group: goods_synchronization_group
- 消费者 3 实现消费
@Service
@RocketMQMessageListener(topic = "mysql-redis-topic", consumerGroup = "goods_synchronization_group")
public class GoodsListener implements RocketMQListener<String> {
@Autowired
private RedisUtil redisUtil;
@Override
public void onMessage(String message) {
System.out.println(message);
}
}