2020-05-15 rocketmq-spring-starter支持多集群

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
原文地址:https://www.cnblogs.com/imgax/p/12893882.html