本文章不会 RocketMQ 做任何深度解析(因为我也不懂),主要从代码角度实现一个实例。
- 官方文档:Quick Start Apache RocketMQ
- 下载 RocketMQ ,我们这里使用刚刚发布的 4.3.0 版本 RocketMQ Releases
- 解压,配置环境变量:ROCKETMQ_HOME:xxxxx/rocketmq-4.3.0
- 我们使用 window ,Linux 与之类似,注意每一步的目标就行。
- 进入到 ROCKETMQ_HOME/bin 目录下
- 启动 mqnamesrv,window 双击 mqnamesrv.cmd,cmd 窗口不要关闭,保持 mqnamesrv 程序运行。
- 启动 mqbroker 需要设置参数:-n 127.0.0.1:9876。 window 下开一个 cmd 窗口,进入到 ROCKETMQ_HOME/bin 目录下,输入 mqbroker -n 127.0.0.1:9876 命令,启动。cmd 窗口不要关闭,保持 mqbroker 运行。
- 以上已完成 RocketMQ 环境的搭建。
- 创建项目工程,添加 rocketmq 依赖。
- 编写生产者代码:
//生产者的组名
DefaultMQProducer producer = new DefaultMQProducer("producerGroup");
//指定NameServer地址,多个地址以 ; 隔开
producer.setNamesrvAddr("127.0.0.1:9876");
try {
/\*\*
\* Producer对象在使用之前必须要调用start初始化,初始化一次即可
\* 注意:切记不可以在每次发送消息时,都调用start方法
*/
producer.start();
for (int i = 0; i < 100; i++) {
String messageBody = "我是消息内容:" + i;
String message = new String(messageBody.getBytes(), "utf-8");
//构建消息
Message msg = new Message("MyTopic" /* PushTopic */, "MyTag"/* Tag */, "key_" + i /* Keys */, message.getBytes());
//发送消息
SendResult result = producer.send(msg);
System.out.println("发送响应:MsgId:" + result.getMsgId() + ",发送状态:" + result.getSendStatus());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
producer.shutdown();
}
- 编写消费者代码:
//消费者的组名
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup");
//指定NameServer地址,多个地址以 ; 隔开
consumer.setNamesrvAddr("127.0.0.1:9876");
try {
//订阅PushTopic下Tag为push的消息
consumer.subscribe("MyTopic", "MyTag");
//设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费
//如果非第一次启动,那么按照上次消费的位置继续消费
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME\_FROM\_FIRST_OFFSET);
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext context) {
try {
for (MessageExt messageExt : list) {
System.out.println("messageExt: " + messageExt);//输出消息内容
String messageBody = new String(messageExt.getBody(), "utf-8");
System.out.println("消费响应:Msg: " + messageExt.getMsgId() + ",msgBody: " + messageBody);//输出消息内容
}
} catch (Exception e) {
e.printStackTrace();
return ConsumeConcurrentlyStatus.RECONSUME_LATER; //稍后再试
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; //消费成功
}
});
consumer.start();
} catch (Exception e) {
e.printStackTrace();
}
- 分别执行这两块代码即可(无先后顺序)
参考: