Apache RocketMQ由4个部分组成:nameServer,broker,producer,consumer,另外还提供了一个console用于监控。
首先确认机器的内网地址和外网地址,我以{内网IP},{外网IP}表示
docker run -d -p 9876:9876 --name rmqserver \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
foxiswho/rocketmq:server
在本地创建配置文件/etc/rocketmq/broker.conf
brokerClusterName = DefaultCluster brokerName = broker-a brokerId = 0 deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH # 以下是我添加的 # 配置nameserver的地址,broker需要上报状态给nameserver namesrvAddr = {内网IP}:9876 # 配置监听地址,nameserver会将此地址提供给客户端使用 # 如果mq服务需要在外网使用则配成外网,需要在内网使用则配成内网地址 brokerIP1 = {外网IP}
docker run -d -p 10911:10911 -p 10909:10909 --name rmqb \
-v /etc/rocketmq/broker.conf:/etc/rocketmq/broker.conf \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
foxiswho/rocketmq:broker
docker run --name rmqconsole -p 8080:8080 \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr={内网IP}:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-t styletang/rocketmq-console-ng
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("s1"); consumer.setNamesrvAddr("{外网IP}:9876"); consumer.subscribe("mytopic", "mytag"); consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { for(int i=0; i<msgs.length(); i++){ MessageExt msg = msgs.get(i); System.out.println(msg.getTopic() + " " + msg.getTags() + " " + new String(msg.getBody())); } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer.start();
DefaultMQProducer producer = new DefaultMQProducer("s2"); producer.setNamesrvAddr("{外网IP}:9876"); producer.start(); Message msg = new Message(); msg.setTopic("mytopic"); msg.setTags("mytag"); msg.setBody("mybody".getBytes()); producer.send(msg);