rocketmq python 一个进程订阅多个topic_【RocketMQ】同一个项目中,同一个topic,可以存在多个消费者么?...

一、问题答案

是不可以的

而且后注册的会替换前注册的,MqConsumer2会替换MqConsumer,并且只结束tag-2的消息

/*** @date 2019/05/28*/@Component

@Slf4jpublic class MqConsumer implementsMessageConsumer {

@Override

@Transactional(rollbackFor= Throwable.class, propagation =Propagation.REQUIRED)public voidonMessage(String msg) {

log.info("接收到的库存MQ消息:{}", msg);

log.info("接收到的库存MQ消息:{}", msg);

log.info("接收到的库存MQ消息:{}", msg);

}

@OverridepublicString getTopic() {return "topic-1";

}

@OverridepublicString getTag() {return "tag-1";

}

}

@Component

@Slf4jpublic class MqConsumer2 implementsMessageConsumer {

@Override

@Transactional(rollbackFor= Throwable.class, propagation =Propagation.REQUIRED)public voidonMessage(String msg) {

log.info("接收到的库存MQ消息:{}", msg);

log.info("接收到的库存MQ消息:{}", msg);

log.info("接收到的库存MQ消息:{}", msg);

}

@OverridepublicString getTopic() {return "topic-1";

}

@OverridepublicString getTag() {return "tag-2";

}

}

二、为什么呢?

我们从源码的角度来分析下

1.订阅消息的方法 public void subscribe(String topic, String subExpression, MessageListener listener) ,其中subExpression即为tag

packagecom.aliyun.openservices.ons.api.impl.rocketmq;

....

@Generated("ons-client")public class ConsumerImpl extends ONSConsumerAbstract implementsConsumer {private final ConcurrentHashMap subscribeTable = new ConcurrentHashMap();public ConsumerImpl(finalProperties properties) {super(properties);boolean postSubscriptionWhenPull = Boolean.parseBoolean(properties.getProperty(PropertyKeyConst.PostSubscriptionWhenPull, "false"));this.defaultMQPushConsumer.setPostSubscriptionWhenPull(postSubscriptionWhenPull);

String messageModel=properties.getProperty(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING);this.defaultMQPushConsumer.setMessageModel(MessageModel.valueOf(messageModel));

}

@Overridepublic voidstart() {this.defaultMQPushConsumer.registerMessageListener(newMessageListenerImpl());super.start();

}

@Overridepublic voidsubscribe(String topic, String subExpression, MessageListener listener) {if (null ==topic) {throw new ONSClientException("topic is null");

}if (null ==listener) {throw new ONSClientException("listener is null");

}this.subscribeTable.put(topic, listener);super.subscribe(topic, subExpression);

}

.....

}

从上面的类中我们可以从this.subscribeTable.put(topic, listener);看到subscribeTable这样的一个Map,该Map与tag无关

2.我们再看super.subscribe(topic, subExpression)方法,属于ONSConsumerAbstract类中

protected voidsubscribe(String topic, String subExpression) {try{this.defaultMQPushConsumer.subscribe(topic, subExpression);

}catch(MQClientException e) {throw new ONSClientException("defaultMQPushConsumer subscribe exception", e);

}

}

DefaultMQPushConsumer中:

@Overridepublic void subscribe(String topic, String subExpression) throwsMQClientException {this.defaultMQPushConsumerImpl.subscribe(withNamespace(topic), subExpression);

}

DefaultMQPushConsumerImpl中:

public void subscribe(String topic, String subExpression) throwsMQClientException {try{

//此处用来构建订阅数据,并且指定了tag

SubscriptionData subscriptionData= FilterAPI.buildSubscriptionData(this.defaultMQPushConsumer.getConsumerGroup(),

topic, subExpression);

//此处将topic和该topic的订阅数据存放到subscriptionInner这个Map中

// protected final ConcurrentMap subscriptionInner = new ConcurrentHashMap();this.rebalanceImpl.getSubscriptionInner().put(topic, subscriptionData);if (this.mQClientFactory != null) {this.mQClientFactory.sendHeartbeatToAllBrokerWithLock();

}

}catch(Exception e) {throw new MQClientException("subscription exception", e);

}

}

三、总结

从上面简单的源码可以看到,有用到两个Map,

subscribeTable 和 subscriptionInner ,并且Map的key都为topic。所以我们可以笃定,RocketMQ在同一个项目中,只支持注册一个topic消费者,那么也就只能指定一个tag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值