rocketmq支持多个集群关键问题在于连接到不同的rocketmq实例
DefaultMQProducer producer实例化会调用以下方法:
org.apache.rocketmq.client.producer.DefaultMQProducer.start
org.apache.rocketmq.client.impl.MQClientManager.getAndCreateMQClientInstance(org.apache.rocketmq.client.ClientConfig, org.apache.rocketmq.remoting.RPCHook)
MQClientManager是单例使用的,内部维护了一个MQClientInstance的map,
key的计算方法如下:
public String buildMQClientId() {
StringBuilder sb = new StringBuilder();
sb.append(this.getClientIP());
sb.append("@");
sb.append(this.getInstanceName());
if (!UtilAll.isBlank(this.unitName)) {
sb.append("@");
sb.append(this.unitName);
}
return sb.toString();
}
instanceName默认值为:
private String instanceName = System.getProperty("rocketmq.client.name", "DEFAULT");
想要连接到不同的MQClientInstance就需要配置不同的instanceName或者unitName
先看官方的实现方法:
rocketmq-spring-starter官方提供了注解 @ExtRocketMQTemplateConfiguration支持发送消息到多个rocketmq集群,相关的文章有:
https://github.com/apache/rocketmq-spring/blob/master/README_zh_CN.md
官方包的实现方式是将RocketMQTemplate bean的名字作为instanceName。
consumer端似乎还缺少支持,扩展下这个注解@RocketMQMessageListener,增加instanceName参数,consumer端初始化时传入这个参数即可。
使用的版本:
rocketmq-client 4.5.2
rocketmq-spring-starter 2.0.5-SNAPSHOT