解决
一共有四个原因:
1 brocker买有连接到mqnameserv
2 producer没有连接到mqnameserv
3 topic没有创建
4 防火墙

说明:
rocktMq中nameserv相当于一个zookeeper,充当一个注册的角色,所以brocker和我们的代码producer是通过nameserv来进行同行的。
brocker的启动命令中 -n xxxx:9876 就是指定 mqnameserv ,producer的代码中 也是 producer.setNamesrvAddr(“xxxx:9876”); ,这里都是指定的mqnameserv。

3 问题 在brocker的启动命令中加入autoCreateTopicEnable=true 就可以了

sh mqbroker -n 10.0.1.1:9876 autoCreateTopicEnable=true
1
4 问题 关闭防火墙就可以了 service iptables stop

1 2 问题

可以自己先到DefaultMQProducerImpl这个类中查看源码,可以看到No route info of this topic是在connect to <> failed 错误的下面的,所以可以自己看源码,一个一个解决。

有人说autoCreateTopicEnable=true 是不行的 https://blog.csdn.net/guiliguiwang/article/details/79852556 ,所以想到了手动创建topic https://www.jianshu.com/p/345aaa18f71d (不是真正的原因)

有人说禁用网卡https://linux.cn/article-10844-1.html?pr (不管用)

有人说关闭vip通道https://www.cnblogs.com/zhjh256/p/6944431.html (不行,我的rockemq版本不支持这个方法)

有人说 https://my.oschina.net/u/3476125/blog/897429 (终于成功了)

方法就是修改brocker.conf 配置文件中的内容 brockerIP1,当然这个方法,很多博客中有提到,但是对我没有用。。。

在这里插入图片描述
总结
因为配置了docker虚拟ip导致,brocker总是代理到docker的虚拟ip上

rocketmq选取ip的思路是,遍历本地的所有网卡ip,过滤掉“127.0” 和“192.168”开头的ip地址,然后得到第一个ip,为本机ip。所以总是代理到docker的ip上了。

在broker.conf配置文件中添加配置 brokerIP1=需要指定的ip

在这里插入图片描述


public class TopicDemo {

	public static void main(String[] args) throws Exception {
		DefaultMQProducer defaultMQProducer = new DefaultMQProducer("HAOKE_IM");

		defaultMQProducer.setNamesrvAddr("127.0.0.1:9876");

		defaultMQProducer.start();

		/**
		 * key:broker名称 ,newTopic:topic名称, queueNum:队列数(分区)
		 */
		defaultMQProducer.createTopic("broker_haoke_im", "my_topic", 8);

		System.out.println("创建topic成功");

		defaultMQProducer.shutdown();
	}
}

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐