创建相关目录
mkdir -p /opt/rocketmq/conf/broker
mkdir -p /opt/rocketmq/conf/namesrv
mkdir -p /opt/rocketmq/data/broker
编写 nameservice 和broker 配置文件
nameservice.conf 如下:
listenPort: 9876
storePathRootDir: /opt/rocketmq-5.1.1/store
broker.conf 如下:
# 集群名称
brokerClusterName = DefaultCluster
# 节点名称
brokerName = rocketmq-broker
# broker id节点ID, 0 表示 master, 其他的正整数表示 slave,不能小于0
brokerId = 0
# Broker服务地址 String 内部使用填内网ip,如果是需要给外部使用填公网ip,自行更改
brokerIP1 = x.x.x.x
# Broker角色
brokerRole = ASYNC_MASTER
# 刷盘方式
flushDiskType = ASYNC_FLUSH
# 在每天的什么时间删除已经超过文件保留时间的 commit log,默认值04
deleteWhen = 04
# 以小时计算的文件保留时间 默认值72小时
fileReservedTime = 72
# 是否允许Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable = true
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup = true
#开启多队列分发特性
enableLmq = true
enableMultiDispatch = true
将nameservice 配置放在 /opt/rocketmq/conf/namesrv 目录
将broker 配置放在 /opt/rocketmq/data/broker 目录
注意:brokerIP1 需要修改成服务器公网ip,否则broker无法访问
编写docker-compose
version: '3'
services:
# NameServer 服务
rocketmq-namesrv:
image: apache/rocketmq:5.1.1
container_name: rocketmq-namesrv
ports:
- "9876:9876" # 映射 NameServer 的端口
volumes:
- ./conf/namesrv:/opt/rocketmq-5.1.1/conf # 映射配置文件目录
command: sh mqnamesrv # 启动 NameServer
# Broker 服务
rocketmq-broker:
image: apache/rocketmq:5.1.1
container_name: rocketmq-broker
depends_on:
- rocketmq-namesrv # 依赖于 NameServer 启动完毕
ports:
- "10911:10911" # 映射 Broker 的端口
- "10909:10909" # 映射 Broker 的 HA 端口
volumes:
- ./conf/broker:/opt/rocketmq-5.1.1/conf
# 映射配置文件目录
command: sh mqbroker -c /opt/rocketmq-5.1.1/conf/broker.conf -n rocketmq-namesrv:9876 # 启动 Broker,连接到 NameServer # 启动 Broker,连接到 NameServer
# RocketMQ Console 服务
rocketmq-console:
image: styletang/rocketmq-console-ng
container_name: rocketmq-console
ports:
- "8083:8080" # 映射 RocketMQ Console 的端口
environment:
- rocketmq.config.namesrvAddr=rocketmq-namesrv:9876 # 配置 RocketMQ Console 连接的 NameServer 地址
将docker-compose 文件放在 /opt/rocketmq 目录下
启动 rocketmq 集群
在/opt/rocketmq目录下执行 docker-compose up -d 启动rocketmq 集群
浏览器输入 http://X.X.X.X:8083/ 查看控制台
创建topic
编写生产者消费者测试类
package com.example.demo;
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.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.Test;
public class RocketmqProducer {
private static final Logger logger = LoggerFactory.getLogger(RocketmqProducer.class);
// RocketMQ配置
private static final String NAME_SERVER_ADDR = "host:9876";
private static final String PRODUCER_GROUP = "your_producer_group";
private static final String CONSUMER_GROUP = "your_consumer_group";
private static final String TOPIC = "joy_topic";
@Test
public void rockMqPush() {
try {
DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);
producer.setNamesrvAddr(NAME_SERVER_ADDR);
producer.start();
// 创建消息实例,参数分别是:主题,消息体
Message message = new Message(TOPIC, "Hello, joy!".getBytes());
// 发送消息并获取发送结果
SendResult sendResult = producer.send(message);
if (sendResult.getSendStatus() == SendStatus.SEND_OK) {
logger.info("消息发送成功,消息ID:{}", sendResult.getMsgId());
} else {
logger.error("消息发送失败,错误信息:{}", sendResult.getSendStatus());
}
} catch (Exception e) {
logger.error("消息发送异常", e);
}
}
@Test
public void rocketmqSub() {
try {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
consumer.setNamesrvAddr(NAME_SERVER_ADDR);
consumer.subscribe(TOPIC, "*");
// 注册消息监听器,处理消息的业务逻辑
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(
java.util.List<MessageExt> msgs,
ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
logger.info("收到消息:{}", new String(msg.getBody()));
}
// 消费成功
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
// 启动消费者
consumer.start();
logger.info("消费者启动成功...");
// 保持进程不退出,监听消息
while (true) {
Thread.sleep(1000);
}
} catch (Exception e) {
logger.error("消费者异常", e);
}
}
}
控制台查看消息