试验环境部署架构
部署了两套 RocketMQ 集群,在 DefaultCluster 集群上创建 Topic——dw_test_01,并在 DefaultClusterb 上创建 Topic——dw_test_02,现在的需求是 order-service-app 要向 dw_test_01、dw_test_02 上发送消息。给出的示例代码如下:
public static void main(String[] args) throws Exception{
// 创建第一个生产者
DefaultMQProducer producer = new DefaultMQProducer("dw_test_producer_group1");
producer.setNamesrvAddr("192.168.3.10:9876");
producer.start();
// 创建第二个生产者
DefaultMQProducer producer2 = new DefaultMQProducer("dw_test_producer_group2");
producer2.setNamesrvAddr("192.168.3.19:9876");
producer2.start();
try {
// 向第一个 RocketMQ 集群发送消息
SendResult result1 = producer.send( new Message("dw_test_01" , "hello
192.168.3.10 nameserver".getBytes()));
System.out.printf("%s%n", result1);
} catch (Throwable e) {
System.out.println("-----first------------");
e.printStackTrace();
System.out.println("-----first------------");
}
try {
// 向第一个 RocketMQ 集群发送消息
SendResult result2 = producer2.send( new Message("dw_test_02" , "hello
192.168.3.19 nameserver".getBytes()));
System.out.printf("%s%n", result2);
} catch (Throwable e) {
System.out.println("-----secornd------------");
e.printStackTrace();
System.out.println("-----secornd------------");
}
//睡眠 10s,简单延迟该任务的结束
Thread.sleep(10000);
}
在向集群 2 发送消息时出现 Topic 不存在,但明明创建了 dw_test_02,而且如果单独向集群 2 的 dw_test_02 发送消息确能成功(服务端设置为不可自动创建topic).为什么会出现这种情况?
走读源码来查询具体的原因
DefaultMQProducer
public class DefaultMQProducer extends ClientConfig implements MQProducer {
//省略其他属性|代码
protected final transient DefaultMQProducerImpl defaultMQProducerImpl;
public DefaultMQProducer(final String producerGroup, RPCHook rpcHook, boolean enableMsgTrace,
final String customizedTraceTopic) {
this.producerGroup = producerGroup;
defaultMQProducerImpl = new DefaultMQProducerImpl(this, rpcHook);
//if client open the message trace feature
if (enableMsgTrace) {
try {
AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(producerGroup, TraceDispatcher.Type.PRODUCE, customizedTraceTopic, rpcHook);
dispatcher.setHostProducer(this.defaultMQProducerImpl);
traceDispatcher = dispatcher;
this.defaultMQProducerImpl.registerSendMessageHook(
new SendMessageTraceHookImpl(traceDispatcher));
} catch (Throwable e) {
log.error("system mqtrace hook init failed ,maybe can't send msg trace data");
}
}
}
@Override
public void start() throws MQClientException {
this.setProducerGroup(withNamespace(this.producerGroup));
this.defaultMQProducerImpl.start();
if (null != traceDispatcher) {
try {
traceDispatcher.start(this.getNamesrvAddr(), this.getAccessChannel());
} catch (MQClientException e) {
log.warn