ClientId各种情况默认生成差异
低版本RocketMq-client
clientId = ip + "@" + pid + ["@" +unitName]
高版本RocketMq-client
clientId = ip + "@" + pid + # + 递增的随机数 + ["@" +unitName]
Rocketmq-client 4.9.1 测试发现生产者、消费者启动(即调用start方法后),如果没有改变系统属性(rocketmq.client.name默认是DEFAULT,也就是instanceName的默认值),则clientId生成会加上递增的随机数,所以一个jvm启动默认clientId不会相同了:
rocketmq-spring
为什么rocketmq-spring同一个项目中,启动多个消费者,clientId不一致呢,这样我们在一个应用中多个消费者其实是对应不同的clientId的,就不会出现只使用第一个启动的MQClientInstance单例对象了。原因如下:
启动注册DefaultRocketMQListenerContainer该Bean时,由于该Bean实现了org.springframework.beans.factory.InitializingBean#afterPropertiesSet方法所以实例设置属性后,会执行该方法实现如下:
①方法如下:
①处,传入参数nameServer(也就是nameServer集群地址:192.168.11.180:9876;192.168.11.181:9876;192.168.11.182:9876)调用工具类的方法获取了InstanceName,工具类方法如下:
所以得到的InstanceName = nameServer + "@"+ pid + "@" + 递增的随机数
此时clientId = ip + nameServer + "@" + pid + "@" + 递增的随机数 + ["@" +unitName]
例子:
但是生产者并没这么处理,所以生产者采用的当前rocketmq-client版本的默认生成方法生成clientId。