ubuntu环境搭建RocketMQ
我在win10安装一直找不到dt.jar,so只能去linus装了。
RocketMQ官网说这样安装,但是不太行,而且很慢。
自己下载的bin格式文件。最后终于成功。
详细步骤
- 下载RocketMQ的源码(上图示),并解压缩
unzip rocketmq-all-4.2.0-bin-release.zip
- 在解压缩的目录中,进入bin目录,视情况修改runbroker.sh和runserver.sh文件中JVM参数,默认参数设置的内存比较大,个人电脑运行不起来,需要调小。我在腾讯云学生机上设置的下面参数是OK的。
runbroker.sh
中
原配置:JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
修改为:JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx256m -Xmn256m"
runserver.sh
中
原配置:JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
修改为:JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
- 插播linus命令
参考 :Linux nohup和&的功效
使用&后台运行程序:
结果会输出到终端
使用Ctrl + C发送SIGINT信号,程序免疫
关闭session发送SIGHUP信号,程序关闭
使用nohup运行程序:
结果默认会输出到nohup.out
使用Ctrl + C发送SIGINT信号,程序关闭
关闭session发送SIGHUP信号,程序免疫
平日线上经常使用nohup和&配合来启动程序:
- 启动Name Server :
在rocketmq目录下,执行如下语句
启动nameserver
nohup sh bin/mqnamesrv &
查看日志
tail -f ~/logs/rocketmqlogs/namesrv.log
root@VM-16-12-ubuntu:/home/lx/download/rocketmq# nohup sh bin/mqnamesrv &
[2] 5601
[1] Exit 143 nohup sh bin/mqnamesrv
执行完上面命令之后自动来到这里,Ctrl + C结束就行,然后执行下面命令查看日志。
root@VM-16-12-ubuntu:/home/lx/download/rocketmq# nohup: ignoring input and appending output to 'nohup.out'
^C
root@VM-16-12-ubuntu:/home/lxw/download/rocketmq# tail -f ~/logs/rocketmqlogs/namesrv.log
2020-03-29 15:53:21 INFO main - tls.server.trustCertPath = null
2020-03-29 15:53:21 INFO main - tls.client.keyPath = null
2020-03-29 15:53:21 INFO main - tls.client.keyPassword = null
2020-03-29 15:53:21 INFO main - tls.client.certPath = null
2020-03-29 15:53:21 INFO main - tls.client.authServer = false
2020-03-29 15:53:21 INFO main - tls.client.trustCertPath = null
2020-03-29 15:53:21 INFO main - Using JDK SSL provider
2020-03-29 15:53:22 INFO main - SSLContext created for server
2020-03-29 15:53:22 INFO NettyEventExecutor - NettyEventExecutor service started
2020-03-29 15:53:22 INFO main - The Name Server boot success. serializeType=JSON
到这个地方就是启动成功了。
- 启动broker
启动broker语句。启动之前,先配置一个文件(适用于阿里云,腾讯云服务器)。
/rocketmq/conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
加上后面的三个。具体为啥,看我下面的一个链接
brokerIP1 = 服务器公网ip
brokerIP2 = 服务器公网ip
namesrvAddr = localhost:9876
下面就是启动了
官网推荐的,但是这有个bug
nohup sh bin/mqbroker -n localhost:9876 &
使用下面的这个,看到是在bin目录下面用了一个配置文件。
root@VM-16-12-ubuntu:/home/lx/download/rocketmq/bin# nohup sh mqbroker -c ../conf/broker.conf &
broker启动时使用-n localhost:9876指定nameServer,将自己的IP地址注册到nameServer
broker会将自己内网地址发送给了nameServer,producer从nameServer获取的是broker的内网IP地址,自然无法连接broker。所以后面你客户端肯定连不上。
问题描述
查看日志命令
tail -f ~/logs/rocketmqlogs/broker.log
- 关闭broker和server语句
在rocketmq目录下执行。
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
在rocketmq目录下执行
sh bin/mqbroker -m 来查看 broker 的配置参数
整合案例代码
创建一个SpringBoot / Maven项目,导入依赖,实测这一个就可以了。
<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-client -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.2.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Producer.java
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
public class Producer {
public static void main(String[] args) throws Exception {
//创建一个消息生产者,并设置一个消息生产者组
DefaultMQProducer producer = new DefaultMQProducer("zs_producer_group");
//指定NameServer地址
producer.setNamesrvAddr("服务器公网ip:9876");
//初始化Producer,在整个应用生命周期中只需要初始化一次
producer.start();
for(int i = 0;i<10;i++) {
//创建一个消息对象,指定其主题、标签和消息内容
Message msg = new Message(
"topic_example_java" /*消息主题名*/,
"TagA" /*消息标签*/,
("Hello Java demo RocketMQ" + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /*消息内容*/
);
//发送消息并返回结果
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
}
//一旦生产者实例不再被使用,则将其关闭,包括清理资源、关闭网络连接等
producer.shutdown();
}
}
Consumer.java
import java.util.Date;
import java.util.List;
import java.io.UnsupportedEncodingException;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
public class Consumer {
public static void main(String[] args) throws Exception {
//创建一个消息消费者,并设置一个消息消费者组
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("zs_consumer_group");
//指定NameServer地址
consumer.setNamesrvAddr("服务器公网ip: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(UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
//消息者对象在使用之前必须要调用start方法初始化
consumer.start();
System.out.println("消息消费者已启动");
}
}
分别启动(先后关系不大),即可。如果有报错,可以查看我的参考链接。
搭建RocketMQ控制台
-
下载地址 :https://github.com/apache/rocketmq-externals.git
-
下载完成后进入
rocketmq-externals-master\rocketmq-console\src\main\resources
文件夹下,修改application.properties
文件。
-
进入
\rocketmq-externals\rocketmq-console
文件夹,执行mvn clean package -Dmaven.test.skip=true
,编译生成。 -
编译成功之后,进入target目录下,拷贝图示jar包到linus服务器上。
执行java -jar rocketmq-console-ng-1.0.1.jar
,启动rocketmq-console-ng-1.0.0.jar
。
然后在浏览器输入服务器IP:配置的端口
。
问题总结
- Broker和NameServer是否正常启动。
- Broker 禁止自动创建 Topic,且用户没有通过手工方式创建 Topic。这个默认是开启的。在rocketmq目录 下执行
sh bin/mqbroker -m
来查看 broker 的配置参数。若autoCreateTopicEnable=true
证明是没有问题的。 - 看服务器控制台开没开端口号。
- 防火墙的设置。
- 配置文件有没有改。
- 是不是内存太小了。
参考
RocketMQ-记RocketMQ启动后producer无法连接到broker的错误及解决方案
RocketMQ4.5.1环境搭建及示例
RocketMQ 常见异常处理