RocketMQ官方文档:Simple Message Example - Apache RocketMQ
RocketMQ4.3监控平台:RocketMQ4.3监控平台(基于双master模式)_jessDL的博客-CSDN博客,到原文看看,支持正版!!!
1、下载二进制压缩包
Downloading the Apache RocketMQ Releases - Apache RocketMQ
解压之后:
2、配置环境变量
ROCKETMQ_HOME=E:\rocketMq\rocketmq-all-4.3.0-bin-release
然后再配置PATH (;%ROCKETMQ_HOME%\bin;)
3、启动RocketMQ
先启动namesrv,然后启动broker,进入rocketmq-all-4.3.0-bin-release\bin目录下,双击mqnamesrv.cmd
看到:The Name Server boot success. serializeType=JSON,namesrv启动成功!
执行命令:mqbroker.cmd -n localhost:9876
看到:The broker[DESKTOP-2ACCV2S, 172.17.56.5:10911] boot success. serializeType=JSON and name server is localhost:9876 broker启动成功!
因为内存分配问题导致启动失败:
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory.
解决办法:修改runserver.cmd和runbroker.cmd默认的内存大小
4、停止服务
记得cd到安装包的bin目录下!!!
停止nameserv:mqshutdown.cmd namesrv
停止broker:mqshutdown.cmd broker
Linux环境下搭建RocketMQ步骤和window环境下一样,因为我的阿里云主机内存大小,玩不起来,没法演示!!
5、RocketMQ简单使用
a、pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>rocketMqDemo</groupId>
<artifactId>rocketMqDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-common</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
b、RocketMqProducer
package com.cn.dl;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* Created by yanshao on 2019/3/8.
*/
public class RocketMqProducer {
//消费组
private static String producerGroup = "rocketMQProducer";
//RocketMq server 地址,多个地址之间用分号分割:192.0.0.1:9876;192.0.0.2:9876
private static String namesrvAddr = "127.0.0.1:9876";
//消息主题
private static String topic = "userOrder";
//消息类型
private static String tag = "order";
public static void main(String[] args) throws IOException {
try {
DefaultMQProducer producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(namesrvAddr);
producer.start();
List<Order> orderList = buildOrders();
for (int i = 0; i < orderList.size(); i++) {
String body = "订单信息 >>> " + orderList.get(i);
//封装消息
Message message = new Message(topic, tag, "KEY" + i, body.getBytes());
SendResult sendResult = producer.send(message, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message meg, Object arg) {
Long id = (Long) arg;
long index = id % mqs.size();
return mqs.get((int)index);
}
// TODO: 2019/3/8 要保证消息顺序不混乱,必须在生产时将消息push到同一个队列即可
}, 0L);
System.out.println("producer >>> " + body+" ,发送状态 >>> " + sendResult.getSendStatus());
}
producer.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
private static List<Order> buildOrders() {
List<Order> orderList = new ArrayList<Order>();
String[] productName = new String[]{
"Apple iPhone XS Max (A2104) 256GB",
"HUAWEI Mate 20",
"三星 Galaxy S10 8GB+512GB",
"荣耀 8X",
"小米 9",
"小米Mix3",
"荣耀 V20"};
for(int i = 0; i < 7; i++){
Order order = Order.builder()
.orderNo(UUID.randomUUID().toString().replace("-",""))
.productName(productName[new Random().nextInt(7)])
.unitPrice(new BigDecimal((new Random().nextInt(10) + 1) * 1000))
.createDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))
.build();
orderList.add(order);
}
return orderList;
}
}
c、RocketMqConsumer
package com.cn.dl;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;
/**
* Created by yanshao on 2019/3/8.
*/
public class RocketMqConsumer {
private static String customerGroup = "rocketMQCustomer";
private static String namesrvAddr = "127.0.0.1:9876";
private static String topic = "userOrder";
private static String tag = "order";
public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(customerGroup);
consumer.setNamesrvAddr(namesrvAddr);
// TODO: 2019/3/8 这里可以设置消费消息的位置
/**
* CONSUME_FROM_FIRST_OFFSET
* CONSUME_FROM_LAST_OFFSET
* 同时会记录消息消息的offset
* */
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
// TODO: 2019/3/8 subExpression 还可以这样写
/**
* tag >>> "order || repay"
* */
consumer.subscribe(topic, tag);
consumer.registerMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> messageExts, ConsumeOrderlyContext context) {
context.setAutoCommit(true);
for (MessageExt messageExt: messageExts) {
System.out.println("consumer >>> " + new String(messageExt.getBody()));
}
return ConsumeOrderlyStatus.SUCCESS;
}
});
consumer.start();
System.out.println("开始消费消息!!!");
}
}
运行结果:
producer >>> 订单信息 >>> Order(orderNo=60f0e1e5eacc48d28a44fc9f274322a0, productName=HUAWEI Mate 20, unitPrice=3000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=3c6506fd46bb4d3eace60b02439d0dfa, productName=小米Mix3, unitPrice=2000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=0ed7948810a94a6d9d3e3ca61a581cff, productName=HUAWEI Mate 20, unitPrice=7000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=0ae85c62c16d474d93becfe6af6b07c1, productName=三星 Galaxy S10 8GB+512GB, unitPrice=9000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=cdcbc85331b34d98a4f310b98ec27eb6, productName=三星 Galaxy S10 8GB+512GB, unitPrice=3000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=105c81148f5c4d7a97819fe13a9217e4, productName=三星 Galaxy S10 8GB+512GB, unitPrice=2000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
producer >>> 订单信息 >>> Order(orderNo=cea55884ec714a45a7b0936b234b188b, productName=Apple iPhone XS Max (A2104) 256GB, unitPrice=6000, createDate=2019-03-08 15:53:43) ,发送状态 >>> SEND_OK
consumer >>> 订单信息 >>> Order(orderNo=60f0e1e5eacc48d28a44fc9f274322a0, productName=HUAWEI Mate 20, unitPrice=3000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=3c6506fd46bb4d3eace60b02439d0dfa, productName=小米Mix3, unitPrice=2000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=0ed7948810a94a6d9d3e3ca61a581cff, productName=HUAWEI Mate 20, unitPrice=7000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=0ae85c62c16d474d93becfe6af6b07c1, productName=三星 Galaxy S10 8GB+512GB, unitPrice=9000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=cdcbc85331b34d98a4f310b98ec27eb6, productName=三星 Galaxy S10 8GB+512GB, unitPrice=3000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=105c81148f5c4d7a97819fe13a9217e4, productName=三星 Galaxy S10 8GB+512GB, unitPrice=2000, createDate=2019-03-08 15:53:43)
consumer >>> 订单信息 >>> Order(orderNo=cea55884ec714a45a7b0936b234b188b, productName=Apple iPhone XS Max (A2104) 256GB, unitPrice=6000, createDate=2019-03-08 15:53:43)