前言
我是自己买的百元一年的服务器,按照RocketMQ官方给的快速开始,于是想着自己搭建一个,于是踩了很多坑,接下来一一列举
1.内存不足
按照官网编译之后,我把它放入到了opt路径下,根据你的安装路径进行变更,你应该进入到以下路径
/opt/rocketmq-all-4.9.5-source-release/distribution/target/rocketmq-4.9.5/rocketmq-4.9.5
,首先确保路径正确
1.1 runserver.sh
默认安装的启动内存参数是非常大的,我当时安装的是JDK8,所以我就改的这个位置,如果你不放心的话,建议把所有地方的的-Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
###1.2 runbroker.sh
官网对于broker 和namesrv的启动教本参数是一点没提,真的很坑,
如果你按照nohup sh bin/mqnamesrv &
启动namerserver的话,你会在当前的文件中看到一个nohup.out
的输出文件,由于我这里已经调好了,没办法给大家截图了,只记得以下一句
insufficient memory for Java runtime
这个时候就需要进行上面的改动了
你以为调整以上两个文件就可以了吗?大错特错
如果你要按照官网往下走,用tools.sh
来测一下自己搭建的有没有问题
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
你会发现启动不起来,因为这个tools.sh启动的时候也有自己相应的参数设置,同理你要进行以下调整,才可以进行测试
2.本地连不上Broker
2.1 RocketMQ默认端口
10909 10911 9876
这三个端口是要在防火墙打开的,我的是云服务上面的
打开之后,再把服务器上的防火墙关闭
systemctl status firewalld
先查看下状态 再进行关闭,否则本地如果用代码中的客户端连接时会报错,连接失败
2.2 broker配置文件相关
broker的配置文件是最搞人心态的,我在这个上面花了好几个小时,如果你尝试上面的方法都没生效的话,可以研究下这个.
官网给出的例子,nohup sh bin/mqbroker -n localhost:9876 --enable-proxy &
proxy的用法还没深入研究,不过对于我们只是搭建起来,可以不用启动proxy,我们可以使用下面的命令进行启动nohup sh bin/mqbroker -n localhost:9876 -c ./conf/xxx.conf &
RocketMQ其实给我们在conf目录下配置了一个默认的broker.conf,这个配置文件里面有很多无用的配置,特别容易造成疑惑,而且很多东西我们都是用不到的
如果你使用了它的默认配置文件那么,tools工具类是可以跑通的,但是之后你会遇到其他的问题时,又会产生疑惑,所以我建议我们新建个配置文件,自己定义配置项.
我这里贴出我的例子
terName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=101.43.232.248
brokerIP2=101.43.232.248
namesrvAddr=101.43.232.248:9876
autoCreateTopicEnable=true
其中brokerIP需要改成自己服务器的公网IP, namesrvAddr也需要指定下,autoCreateTopicEnable=true,如果不配置这个的话,RocketMQ是不会帮我们自动创建topic的,当你在本地进行调试的时候会报错,一个No route info of this topic
(请留意下这个问题,网上很多人都遇到了这个问题,下面我还会再说一个操作跟这个问题相关)
3.代码调试
3.1 Producer类
public class Producer {
public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException,
InterruptedException, MQBrokerException {
// 创建一个消息生产者, 并设置一个消息生产者组
DefaultMQProducer producer = new DefaultMQProducer("producer_group");
// 指定NameServer地址
producer.setNamesrvAddr("101.43.232.248:9876");
producer.start();
// 初始化Producer 在整个应用生命周期中只需要初始化一次
for (int i = 0; i < 100; i++) {
// 创建一个消息对象,指定其主题、标签和消息内容
Message msg =
new Message("topic_example_java",
"TagA",
("Hello Java demo RocketMQ" + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
// 发送消息并返回结果
SendResult send = producer.send(msg, 100000);
System.out.println("send = " + send);
}
// 一旦生产者实例不再被使用,则将其关闭,包括清理资源 关闭网络连接等
producer.shutdown();
}
}
3.2 Consumer类
public class Consumer {
public static void main(String[] args) throws MQClientException {
// 创建一个消息消费者,并设置一个消息消费者组
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");
// 指定NameServer地址
consumer.setNamesrvAddr("101.43.232.248:9876");
// 设置consumer 第一次启动时是从队列头部还是队列尾部开始消费
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
// 订阅指定Topic下的所有消息
consumer.subscribe("topic_example_java", "*");
// 注册消息监听器
consumer.registerMessageListener((List<MessageExt> list, ConsumeConcurrentlyContext context) -> {
// 默认list 里只有一条消息,可以通过设置参数来批量接收消息
if (list != null) {
for (MessageExt ext : list) {
try {
System.out.println(new Date() + new String(ext.getBody(), "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();
System.out.println("消息消费者已启动");
}
}
先启动Consumer,防止消息出现丢失
再启动Producer
3.3 maven 依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.9.5</version>
</dependency>
这里一定使用的Client一定要和我们部署的Server版本号要一致,否则会出现各种问题
connect xxxx:10911/10909 端口号失败,大多和客户端的版本号,broker的配置文件有关系,
如果你按照上面的教程还是搭建不起来,可以在下方评论留言