zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【scala语言入门】二、匿名函数
    【scala语言入门】 一、apply与unapply
    关于timeOut超时后是否会回滚的思考
    [算法]-插入排序
    【oenCV系列】 写视频
    【Opencv系列】
    Factory Method模式精解(C++版本)
    Template Method模式精解(C++版本)
    Adapter模式精解(C++版本)
    迭代器模式精解(C++版本)
  • 原文地址:https://www.cnblogs.com/imgax/p/12893882.html
Copyright © 2011-2022 走看看