RocketMQ新创建生产者时报异常:
The producer group[ ] has been created before, specify another name please.

发送消息时报异常:
com.alibaba.rocketmq.client.exception.MQClientException: The producer service state not OK, CREATE_JUST

解决办法:
new DefaultMQProducer时,提供instance name,而且instance name唯一。

producer.setInstanceName(RunTimeUtil.getRocketMqUniqeInstanceName());

注:我的使用场景是:消费者拿到消息后再创建生产者,将消息发送出去。消费时,是多线程的,如果同时发过来多条消息,就会导致多线程创建生产者,生产者被重复创建了,从而报上面的异常。如果每次只发一条消息,等消费完了再发下一条,即使不设置instance name,也不会出现上面的异常。
另外,虽然设置instance name,可以解决此问题,但根源还是用法不对。


为什么提供唯一instance name后,每次再创建DefaultMQProducer就不会报:The producer group[ ] has been created before, specify another name please.了呢?

我们分析一下源码,来查找原因:

  • 首先producer创建后,启动:

    此处的producer没有设置instance name。

  • 通过上面的start()方法,调用到如下start方法,这段代码是producer启动执行的核心代码。

说明一下,
图中1处是对instance name的处理,如果instance name没有指定,则取pid作为instance name;
图中2处是根据client id获取client instance,这个client id是由client ip加instance name组成。如果client id存在,则取出对应的client instance,如果client id不存在,则创建并保存client instance;
图中3处是注册生产者,如果生产者之前注册过,就会输出异常。

  • 上图中1处的代码展开:

一开始instance name没有指定,那么会默认给分配一个缺省的名字:DEFAULT,因为instanceName等于DEFAULT,所以获取pid(整数,例如:76052)作为instance name。一个实例中,每次获取的pid肯定是一样的。

  • 上图2处的代码展开:

图中2.1处生成clientId,这个client id是由client ip加instance name组成。因为instance name在之前创建producer时没有指定一个唯一字符串,所以取的是pid。factoryTable之前没有保存过该clientId,所以new一个MQClientInstance,并放到factoryTable中。等下次再次创建producer时,因为pid一致,所以clientId也一样,从factoryTable中就get到之前创建的那个MQClientInstance。

  • 上图3处的代码展开:

从2处得到MQClientInstance,通过他注册生产者(生产者加入producerTable),如果之前保存过该生产者,返回false。

分析:第一次:创建producer时,没有指定instance name,所以取pid(假设为76052)作为instance name,后面的clientId等于ip+76052,factoryTable没有此clientId,创建MQClientInstance并写入factoryTable,返回此MQClientInstance。
使用此MQClientInstance去registerProducer,因为MQClientInstance是new出来的,所以MQClientInstance的producerTable为空,把producer保存到producerTable,并返回true。至此,registerOK!!

第二次:创建producer时,没有指定instance name,所以取pid(假设为76052)作为instance name,后面的clientId等于ip+76052,factoryTable有此clientId,直接之前的MQClientInstance。
使用此MQClientInstance去registerProducer,因为MQClientInstance是已存在的,所以MQClientInstance的producerTable不为空,从中取出之前保存的producer,并返回false。至此,register不OK!!抛出异常!!

而如果每次创建producer时,指定instance name呢?
创建producer时,指定instance name(唯一且每次更新),后面的clientId等于ip+InstanceName,因为instance name唯一,所以factoryTable没有此clientId,创建MQClientInstance并写入factoryTable,返回此MQClientInstance。
使用此MQClientInstance去registerProducer,因为MQClientInstance是new出来的,所以MQClientInstance的producerTable为空,把producer保存到producerTable,并返回true。至此,registerOK!!
因为instance name唯一,所以每次都会new MQClientInstance,这样MQClientInstance的producerTable总是为空,总返回true。所以,一直registerOK!!

RocketMQ:The producer group has been created before, specify another name please.相关推荐

  1. 关于 RocketMQ:The producer group has been created before, specify another name please.这个报错的解决办法...

    1.在网上看了一些解决这个问题的办法,大部分朋友都说是要在实例化 DefaultMQProducer 的时候指定惟一的 instanceName 来解决,窃以为这样虽然解决了问题,但却是不应该用的解决 ...

  2. The producer group has been created before

    为什么80%的码农都做不了架构师?>>>    编写一个help类 public class RunTimeUtil {private static AtomicInteger in ...

  3. RocketMQ特性、专业术语(Producer,Producer Group,Consumer Group,Topic,Message,Tag,Broker,Name Server)等

    RocketMQ 是什么 Github 上关于 RocketMQ 的介绍:RcoketMQ 是一款低延迟.高可靠.可伸缩.易于使用的消息中间件.具有以下特性: 支持发布/订阅(Pub/Sub)和点对点 ...

  4. The consumer group has been created before, specify another name please RocketMQ异常

    解决方案一: rocketmq 报 The consumer group has been created before, specify another name please. 错误 是因为一个s ...

  5. RocketMQ:Producer启动流程与消息发送源码分析

    文章目录 Producer 1.方法和属性 2.启动流程 3.消息发送 3.1验证消息 3.2查找路由 3.3选择队列 3.4发送消息 3.5发送批量消息 Producer 在RocketMQ中,消息 ...

  6. 从源码分析RocketMQ系列-Producer的SendResult来自哪里?

    导语   对于消息中间件大家都应该不陌生,现在比较主流的消息中间件有Kafka.RabbitMQ.RocketMQ.ActiveMQ等等.前段时间花了很长时间分析了关于RocketMQ源码,之前也分享 ...

  7. RocketMQ学习笔记(8)----RocketMQ的Producer API简介

    在RocketMQ中提供了三种发送消息的模式: 1.NormalProducer(普通) 2.OrderProducer(顺序) 3.TransactionProducer(事务) 下面来介绍一下pr ...

  8. RocketMQ的Producer详解之分布式事务消息(代码实现以及过程分析)

    执行流程 1. 发送方向 MQ 服务端发送消息. 2. MQ Server 将消息持久化成功之后,向发送方 ACK 确认消息已经发送成功,此时消息为半消息. 3. 发送方开始执行本地事务逻辑. 4. ...

  9. rocketmq中producer设计与实现

    1.类层次结构 2.producer的启动 首先设置组,及NameServer,然后调用start启动.启动关键逻辑主要在MQClientInstance中. (1)启动NettyRemotingCl ...

最新文章

  1. 利用svg技术实现在线动画演示
  2. tinyxml使用指导
  3. sift计算描述子代码详解_SIFT解析(三)生成特征描述子
  4. 在python中使用csv库以字典格式读写csv文件
  5. nginx日志中添加请求的response日志
  6. word文档服务器多人打开后就损坏,打开word文档损坏
  7. python finally的作用_Python finally
  8. 简书的假想用户场景以及不同用户各自需要解决的烦恼
  9. 静态成员变量和非静态成员变量
  10. jetson tx2上运行mobilenet-ssd的坑:interrupted by signal 9: SIGKILL
  11. Oracle表分区大全
  12. photoshop柔光模式原理和案例教程
  13. Android变声(SoundTouch)
  14. git 同时连接云效平台和github
  15. 手写简易java消息队列
  16. C语言与C++常见问答题
  17. OpenCV的viz库学习(一)
  18. 按照 STAR 法则介绍自己做过的项目
  19. 潜伏者(NOIP2009)
  20. 等保2.0.等保对象知多少

热门文章

  1. vue组件库大全(忘了的时候可以进来找一下~)
  2. ★★★Windows系统进程列表完全解析★★★
  3. 金融断直连,正式开始落地!
  4. video视频播放过程抓取图片/截图并在浏览器端下载
  5. matlab换挡程序,一种基于MATLAB换挡过程中快速锁定分析数据的方法与流程
  6. Unsupervised Learning: Deep Auto-encoder
  7. UR机器人(5)-使用变量
  8. Android 动画解析(一) 逐帧动画(Frame Animation)
  9. 推特开发者 推特 oauth1.0a 授权【推特开发者文档系列12】
  10. 从零开始安卓端相机功能开发(二)让我们来开发一个相机