参考原文:本地用docker快速搭建RocketMQ
下载rocketmq
docker pull rocketmqinc/rocketmq:4.4.0
先想好你要把rocketmq产生的文件放在电脑哪个位置,下面把这个位置称为[RmHome]。
[RmHome] 最好是你用于测试的java项目的地址。如下图,这样你就可以直接在里面敲命令
在[RmHome]创建conf文件夹,在[RmHome]/conf中创建broker.conf文件,文件内容如下
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = 你自己的IPv4 地址
在[RmHome]创建stack.yml文件,内容如下:
version: '3.1'
services:
rmqnamesrv:
image: rocketmqinc/rocketmq:4.4.0
command: sh mqnamesrv
restart: always
environment:
MAX_POSSIBLE_HEAP: 100000000
networks:
mq-network:
aliases:
- rmqnamesrv
volumes:
- ./namesrv/logs:/root/logs
- ./namesrv/store:/root/store
ports:
- 9876:9876
broker:
image: rocketmqinc/rocketmq:4.4.0
command: sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf
restart: always
networks:
mq-network:
aliases:
- broker
environment:
NAMESRV_ADDR: rmqnamesrv:9876
MAX_POSSIBLE_HEAP: 200000000
volumes:
- ./broker/logs:/root/logs
- ./broker/store:/root/store
- ./conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
ports:
- 10911:10911
- 10909:10909
depends_on:
- rmqnamesrv
console:
image: styletang/rocketmq-console-ng
environment:
JAVA_OPTS: -Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Dserver.port=8888
networks:
mq-network:
aliases:
- console
ports:
- 8888:8888
depends_on:
- rmqnamesrv
- broker
networks:
mq-network:
driver: bridge
命令行在[RmHome]路径下敲以下命令:
docker-compose -f stack.yml up
RocketMq控制台
IDEA 创建测试项目
生产者,不用修改,直接复制,本地测试是没问题的。
public class SyncProducer {
public static void main(String[] args) throws Exception {
// 实例化消息生产者Producer
DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
// 设置NameServer的地址
producer.setNamesrvAddr("localhost:9876");
// 启动Producer实例
producer.start();
for (int i = 0; i < 2; i++) {
// 创建消息,并指定Topic,Tag和消息体
Message msg = new Message("TopicTest" , "TagA" , ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)
);
// 发送消息到一个Broker
SendResult sendResult = producer.send(msg);
// 通过sendResult返回消息是否成功送达
System.out.printf("生产消息啦"+"%s%n", sendResult);
}
// 如果不再发送消息,关闭Producer实例。
producer.shutdown();
}
}
消费者 不用修改,直接复制,本地测试是没问题的。
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
// Instantiate with specified consumer group name.
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name");
// Specify name server addresses.
consumer.setNamesrvAddr("localhost: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() {
public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
for (MessageExt msg : msgs) {
System.out.println(msg.getTopic());
System.out.println(msg.getTags());
System.out.println("收到消息:" + new String(msg.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//Launch the consumer instance.
consumer.start();
System.out.printf("Consumer Started.%n");
}
}
发送消息成功
消费消息成功