这两天在安装RocketMQ时,发现官网上给的安装方案太简略了。。。安装完毕后服务根本无法启动,特出本教程记录一下,以备日后使用
安装及验证流程
- 下载
rocketmq
安装包,目前最新为4.4.0
,点击下载:rocketmq-all-4.4.0-bin-release.zip - 解压压缩包:
unzip rocketmq-all-4.4.0-bin.release.zip
- 进入bin文件夹下:
cd ./``rocketmq-all-4.4.0-bin.release/bin
- 修改
runbroker.sh
、runserver.sh
、tools.sh
文件,需要修改项如下:
# 前三项注释掉,然后添加一行,并配置上本地的jdk路径
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/home/chao/Softwares/JavaSoftwares/jdk1.8.0_211
# 本地测试环境需要将此处的值设小,默认的内存分配太大
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx2g -Xmn1g"
- 进入
conf
文件夹,创建broker.properties
文件 - 编辑
broker.properties
文件,如下:
# broker默认集群名称
brokerClusterName = DefaultCluster
# broker名称,可随意配置
brokerName = broker-a
# brokerId值
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 配置为本机IP,若不配置,并且本机装有docker,broker地址会自动配置成docker的内网ip地址
brokerIP1=192.168.81.48
brokerIP2=192.168.81.48
# name服务器地址
namesrvAddr=192.168.81.48:9876
# 是否开启自动创建主题,若不开启,需要手动创建主题
autoCreateTopicEnable=true
- 启动Name服务器(建议在Linux服务器上安装screen,然后在screen中分别启动服务):
./bin/mqnamesrv
启动后日志打印如下:
The Name Server boot success. serializeType=JSON
8. 启动broker服务器: ./bin/mqbroker -f conf/borker.properties
启动后日志打印如下:
The broker[broker-a, 192.168.81.48:10911] boot success. serializeType=JSON and name server is 192.168.81.48:9876
- 先在本机进行测试:
测试Producer消息的发送
> export NAMESRV_ADDR=192.168.81.48:9876
> ./bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...
测试Consumer消息的接收
> ./bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_%d Receive New Messages: [MessageExt...
- 远程程序调用,若进行远程程序调用,请开放Linux服务器的9876、10911端口
- 本地新建项目,引入客户端依赖:
compile 'org.apache.rocketmq:rocketmq-client:4.4.0'
- 创建生产者测试类:
SyncProducer
public class SyncProducer {
public static void main(String[] args) throws InterruptedException, MQClientException {
DefaultMQProducer producer = new DefaultMQProducer("chaoGroup");
//rocketmq默认3s超时,确认一切配置没问题,但是当进行消息发送的时候,还一直报路由找不到,或者调用超时,那么调大超时时间
producer.setSendMsgTimeout(60000);
producer.setNamesrvAddr("192.168.81.48:9876");
producer.start();
for (int i = 0; i < 1000; i++) {
try {
Message msg = new Message("TopicTest" /* Topic */,
"TagA" /* Tag */,
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
);
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
} catch (Exception e) {
e.printStackTrace();
Thread.sleep(1000);
}
}
producer.shutdown();
}
}
- 创建消费者测试类:
Conusmer
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
// Instantiate with specified consumer group name.
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("conusmerGroup");
// Specify name server addresses.
consumer.setNamesrvAddr("192.168.81.48:9876");
// Subscribe one more more topics to consume.
consumer.subscribe("TopicTest", "*");
// Register callback to execute on arrival of messages fetched from brokers.
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
ConsumeConcurrentlyContext context) {
System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//Launch the consumer instance.
consumer.start();
System.out.printf("Consumer Started.%n");
}
}