生产者和消费者,发消息和接收消息,完整示例
RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,已经于2016年11月成为 Apache 孵化项目,相信RocketMQ的未来会发挥着越来越大的作用,将有更多的开发者因此受益。
本文仅对RocketMQ的简单实用做入门性介绍,不对RocketMQ的底层原理进行深入介绍,后续文章将对RocketMQ的原理做详细介绍。
一、添加RocketMQ的Maven依赖:
[java] view plain copy
- <!-- https://mvnrepository.com/artifact/com.alibaba.rocketmq/rocketmq-client -->
- <dependency>
- <groupId>com.alibaba.rocketmq</groupId>
- <artifactId>rocketmq-client</artifactId>
- <version>3.2.6</version>
- </dependency>
二、 MQ的消费类RocketMQConsumer.java:
[java] view plain copy
- package com.lance.rocketMQ.RocketMQ;
- import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
- import com.alibaba.rocketmq.client.consumer.listener.MessageListener;
- import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import com.alibaba.rocketmq.client.exception.MQClientException;
- import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
- import java.util.UUID;
- /**
- * 消费类
- */
- public class RocketMQConsumer {
- private DefaultMQPushConsumer consumer;
- private MessageListener listener;
- protected String nameServer;
- protected String groupName;
- protected String topics;
- public RocketMQConsumer(MessageListener listener, String nameServer, String groupName, String topics) {
- this.listener = listener;
- this.nameServer = nameServer;
- this.groupName = groupName;
- this.topics = topics;
- }
- /**
- * 初始化方法
- */
- public void init() {
- consumer = new DefaultMQPushConsumer(groupName);
- consumer.setNamesrvAddr(nameServer);
- try {
- consumer.subscribe(topics, "*"); //topic 与tag 生产者未设置tag,消费者可将tag设置为*
- } catch (MQClientException e) {
- e.printStackTrace();
- }
- consumer.setInstanceName(UUID.randomUUID().toString());
- consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
- consumer.registerMessageListener((MessageListenerConcurrently) this.listener);
- try {
- consumer.start(); //启动消费者
- } catch (MQClientException e) {
- e.printStackTrace();
- }
- System.out.println("RocketMQConsumer Started! group=" + consumer.getConsumerGroup() + " instance=" + consumer.getInstanceName()
- );
- }
- }
三、MQ消息的监听接口类RocketMQListener.java
[java] view plain copy
- package com.lance.rocketMQ.RocketMQ;
- import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import com.alibaba.rocketmq.common.message.MessageExt;
- import java.util.List;
- /**
- * 消费监听类
- */
- public class RocketMQListener implements MessageListenerConcurrently {
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- // System.out.println("get data from rocketMQ:" + msgs);
- for (MessageExt message : msgs) {
- String msg = new String(message.getBody()); //从mq中取得消息
- System.out.println("msg data from rocketMQ:" + msg);
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; //消费成功,返回消息 失败:RECONSUME_LATER
- }
- }
四、 MQ消息的生产者类RocketMQProducer.java
[java] view plain copy
- package com.lance.rocketMQ.RocketMQ;
- import com.alibaba.rocketmq.client.exception.MQClientException;
- import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
- import com.alibaba.rocketmq.client.producer.SendResult;
- import com.alibaba.rocketmq.client.producer.SendStatus;
- import com.alibaba.rocketmq.common.message.Message;
- import java.util.UUID;
- /**
- * 生产者
- */
- public class RocketMQProducer {
- private DefaultMQProducer sender;
- protected String nameServer;
- protected String groupName;
- protected String topics;
- //初始化生产者
- public void init() {
- sender = new DefaultMQProducer(groupName);
- sender.setNamesrvAddr(nameServer);
- sender.setInstanceName(UUID.randomUUID().toString());
- try {
- sender.start(); //启动生产者
- } catch (MQClientException e) {
- e.printStackTrace();
- }
- }
- public RocketMQProducer(String nameServer, String groupName, String topics) {
- this.nameServer = nameServer;
- this.groupName = groupName;
- this.topics = topics;
- }
- //发送消息
- public void send(Message message) {
- message.setTopic(topics);
- try {
- SendResult result = sender.send(message);
- SendStatus status = result.getSendStatus();
- System.out.println("messageId=" + result.getMsgId() + ", status=" + status);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
五、测试RocketMQ的消费 RocketMQConsumerTest.java
[java] view plain copy
- package com.lance.rocketMQ.RocketMQ;
- /**
- * 测试消费者
- */
- public class RocketMQConsumerTest {
- public static void main(String[] args) {
- String mqNameServer = "172.10.254.2:9876"; //注册地址
- String mqTopics = "MQ-MSG-TOPICS-TEST"; //主题
- String consumerMqGroupName = "CONSUMER-MQ-GROUP"; //消费组
- RocketMQListener mqListener = new RocketMQListener();
- RocketMQConsumer mqConsumer = new RocketMQConsumer(mqListener, mqNameServer, consumerMqGroupName, mqTopics);
- mqConsumer.init(); //调用消费者
- try {
- Thread.sleep(1000 * 60L);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
run RocketMQConsumerTest.java 之后,控制台输出:
[java] view plain copy
- RocketMQConsumer Started! group=CONSUMER-MQ-GROUP instance=1eb7d308-4414-4658-90b5-e2cae3b793eb
结果分析: 此时MQ对应的TOPIC中并没有响应的消息,故收不到消息,仅看到MQ消费者正常启动信息。
六、MQ的生产者测试类:RocketMQProducerTest.java
[java] view plain copy
- package com.lance.rocketMQ.RocketMQ;
- import com.alibaba.rocketmq.common.message.Message;
- /**
- * 生产者测试
- */
- public class RocketMQProducerTest {
- public static void main(String[] args) {
- String mqNameServer = "172.10.254.2:9876"; //生产者注册地址
- String mqTopics = "MQ-MSG-TOPICS-TEST"; //主题
- String producerMqGroupName = "PRODUCER-MQ-GROUP"; //生产者group
- RocketMQProducer mqProducer = new RocketMQProducer(mqNameServer, producerMqGroupName, mqTopics);
- mqProducer.init();
- for (int i = 0; i < 5; i++) {
- Message message = new Message();
- message.setBody(("I send message to RocketMQ " + i).getBytes());
- mqProducer.send(message); //发送消息
- }
- }
- }
run RocketMQProducerTest.java 之后,RocketMQProducerTest.java 对应的控制台输出为:
[java] view plain copy
- messageId=0A71290100002A9F00000003D0BB0832, status=SEND_OK
- messageId=0A71290100002A9F00000003D0BB08BB, status=SEND_OK
- messageId=0A71290100002A9F00000003D0BB0944, status=SEND_OK
- messageId=0A71290100002A9F00000003D0BB09CD, status=SEND_OK
- messageId=0A71290300002A9F000000005440AEED, status=SEND_OK
结果分析:表明所有消息都已经正常发送,且被RocketMQ正常接收。
此时查看RocketMQConsumerTest.java对应的控制台输出发生改变,输出内容变更如下:
[java] view plain copy
- RocketMQConsumer Started! group=CONSUMER-MQ-GROUP instance=1eb7d308-4414-4658-90b5-e2cae3b793eb
- msg data from rocketMQ:I send message to RocketMQ 1
- msg data from rocketMQ:I send message to RocketMQ 0
- msg data from rocketMQ:I send message to RocketMQ 3
- msg data from rocketMQ:I send message to RocketMQ 2
- msg data from rocketMQ:I send message to RocketMQ 4