因为业务需要,所以项目需要发消息到两个不同NameServerAddr的RocketMQ
第一个Rocketmq是直接用springboot-rocketmq
第二个Rocketmq是封装了一下,手动创建DefaultMQProduct的
试着发送了消息,两个都显示SEND_OK
但发现消息都跑到了同一个RocketMQ上。
后来看了下源码,发现原因是用了同一个MQClientInstance。
MQClientInstance通过MQClientManager获取得到,MQClientManager通过ClientID判断当前MQClientInstance存不存在,存在则不生成。
ClientID的生成规则:
org.apache.rocketmq.client.ClientConfig的buildMQClientId方法
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();
}
因为DefaultMQProducer extends ClientConfig,所以我在第二个RocketMQ手动创建DefaultMQProducer时,指定了unitName,这样二个Rocketmq的ClientID就不一样,消息就不会发到同个MQ上了.
第二 因为项目跟第二个RocketMQ在不同的网段上,无法通过内网访问,运维用了一个公网IP跟第二个RocketMQ的内网IP及几个端口都做了映射。但是在连接时,依然会报
RemotingConnectException: connect to <内网IP:10911> failed
连接到第二个RocketMQ所在服务器,打开对应目录的conf/broker.conf文件
指定brokerIP1为外网地址,据说就可以解决这个问题。但这个解决方案未尝试,因为有很多部门都连这个MQ,不好改IP。