zoukankan      html  css  js  c++  java
  • Rocketmq之一个JVM中producer的producerGroup要唯一

    如果代码是这么写的

    public static void main (String[] args) throws MQClientException {
    
            DefaultMQProducer defaultMQProducer = new DefaultMQProducer();
            defaultMQProducer.setProducerGroup("operationLogGroup");
            defaultMQProducer.setInstanceName("Constant.operationLogInstance");
            defaultMQProducer.setNamesrvAddr("Constant.rocketQueneAddr");
    
            DefaultMQProducer defaultMQProducer2 = new DefaultMQProducer();
            defaultMQProducer2.setProducerGroup("operationLogGroup");
            defaultMQProducer2.setInstanceName("Constant.operationLogInstance");
            defaultMQProducer2.setNamesrvAddr("Constant.rocketQueneAddr");
            try {
                defaultMQProducer.start();
                defaultMQProducer2.start();
                Message message = new Message();
    
                defaultMQProducer.send(message);
            } catch (Exception e) {
                System.out.println("produce operation log message error" + e.getMessage());
            } finally {
                defaultMQProducer.shutdown();
            }
        }

    一旦执行会报错

    produce operation log message errorThe producer group[operationLogGroup] has been created before, specify another name please.

    源代码是在这里

    DefaultMQProducerImpl#start()

    public void start(final boolean startFactory) throws MQClientException {
            switch (this.serviceState) {
                case CREATE_JUST:
                    this.serviceState = ServiceState.START_FAILED;
    
                    this.checkConfig();
    
                    if (!this.defaultMQProducer.getProducerGroup().equals(MixAll.CLIENT_INNER_PRODUCER_GROUP)) {
                        this.defaultMQProducer.changeInstanceNameToPID();
                    }
    
                    this.mQClientFactory = MQClientManager.getInstance().getOrCreateMQClientInstance(this.defaultMQProducer, rpcHook);
    
                    boolean registerOK = mQClientFactory.registerProducer(this.defaultMQProducer.getProducerGroup(), this);
    public boolean registerProducer(final String group, final DefaultMQProducerImpl producer) {
            if (null == group || null == producer) {
                return false;
            }
    
            MQProducerInner prev = this.producerTable.putIfAbsent(group, producer);
            if (prev != null) {
                log.warn("the producer group[{}] exist already.", group);
                return false;
            }
    
            return true;
        }

    其中  private final ConcurrentMap<String/* group */, MQProducerInner> producerTable = new ConcurrentHashMap<String, MQProducerInner>(); 

    所以一个JVM中同一个producergroup不能有两个producer的

    同样的是,在一个JVM进程中同一个消费组也不能有两个消费者。

     
  • 相关阅读:
    Azure 中的多个 VM NIC 和网络虚拟设备
    程序猿入职秘籍大分享!分分钟走上人生巅峰
    高考估分查分选志愿一键搞定_支付宝又操办了件人生大事
    三大新兴力量_引领中国消费新经济丨图媒体
    史上最全编程语言列表_你掌握了哪些?
    市值登顶亚洲后_马云对话全球投资者:与未来相比阿里还是个baby
    无法访问ECS云服务器怎么解决?
    快速搭建phpwind论坛系统
    Linux全自动安装面板脚本_支持目前比较流行的国内面板
    为阿里云ECS(Windows 2012)创建IPv6隧道地址
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14756985.html
Copyright © 2011-2022 走看看