RocketMQ(一) 生产者和消费者完整示例

生产者和消费者,发消息和接收消息,完整示例

 RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,已经于2016年11月成为 Apache 孵化项目,相信RocketMQ的未来会发挥着越来越大的作用,将有更多的开发者因此受益。

        本文仅对RocketMQ的简单实用做入门性介绍,不对RocketMQ的底层原理进行深入介绍,后续文章将对RocketMQ的原理做详细介绍。

        一、添加RocketMQ的Maven依赖:

   

[java] view plain copy

  1. <!-- https://mvnrepository.com/artifact/com.alibaba.rocketmq/rocketmq-client -->  
  2. <dependency>  
  3.     <groupId>com.alibaba.rocketmq</groupId>  
  4.     <artifactId>rocketmq-client</artifactId>  
  5.     <version>3.2.6</version>  
  6. </dependency>  

   二、  MQ的消费类RocketMQConsumer.java:

    

[java] view plain copy

  1. package com.lance.rocketMQ.RocketMQ;  
  2.   
  3. import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;  
  4. import com.alibaba.rocketmq.client.consumer.listener.MessageListener;  
  5. import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;  
  6. import com.alibaba.rocketmq.client.exception.MQClientException;  
  7. import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;  
  8.   
  9. import java.util.UUID;  
  10.   
  11.   
  12. /** 
  13.  * 消费类
  14.  */  
  15. public class RocketMQConsumer {  
  16.   
  17.     private DefaultMQPushConsumer consumer;  
  18.   
  19.     private MessageListener listener;  
  20.   
  21.     protected String nameServer;  
  22.   
  23.     protected String groupName;  
  24.   
  25.     protected String topics;  
  26.   
  27.     public RocketMQConsumer(MessageListener listener, String nameServer, String groupName, String topics) {  
  28.         this.listener = listener;  
  29.         this.nameServer = nameServer;  
  30.         this.groupName = groupName;  
  31.         this.topics = topics;  
  32.     }  
  33.  /**
  34. * 初始化方法
  35. */
  36.     public void init() {  
  37.         consumer = new DefaultMQPushConsumer(groupName);  
  38.         consumer.setNamesrvAddr(nameServer);  
  39.         try {  
  40.             consumer.subscribe(topics, "*");  //topic 与tag  生产者未设置tag,消费者可将tag设置为*
  41.         } catch (MQClientException e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.         consumer.setInstanceName(UUID.randomUUID().toString());  
  45.         consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);  
  46.         consumer.registerMessageListener((MessageListenerConcurrently) this.listener);  
  47.   
  48.         try {  
  49.             consumer.start();  //启动消费者
  50.         } catch (MQClientException e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.         System.out.println("RocketMQConsumer Started! group=" + consumer.getConsumerGroup() + " instance=" + consumer.getInstanceName()  
  54.         );  
  55.     }  
  56.   
  57.   
  58. }  

       三、MQ消息的监听接口类RocketMQListener.java

      

        

[java] view plain copy

  1. package com.lance.rocketMQ.RocketMQ;  
  2.   
  3. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;  
  4. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;  
  5. import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;  
  6. import com.alibaba.rocketmq.common.message.MessageExt;  
  7.   
  8. import java.util.List;  
  9.   
  10. /** 
  11.  * 消费监听类
  12.  */  
  13. public class RocketMQListener  implements MessageListenerConcurrently {  
  14.   
  15.   
  16.     @Override  
  17.     public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {  
  18. //        System.out.println("get data from rocketMQ:" + msgs);  
  19.         for (MessageExt message : msgs) {  
  20.   
  21.             String msg = new String(message.getBody()); //从mq中取得消息 
  22.             System.out.println("msg data from rocketMQ:" + msg);  
  23.         }  
  24.   
  25.         return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;  //消费成功,返回消息  失败:RECONSUME_LATER
  26.     }  
  27. }  

       四、 MQ消息的生产者类RocketMQProducer.java

[java] view plain copy

  1. package com.lance.rocketMQ.RocketMQ;  
  2.   
  3. import com.alibaba.rocketmq.client.exception.MQClientException;  
  4. import com.alibaba.rocketmq.client.producer.DefaultMQProducer;  
  5. import com.alibaba.rocketmq.client.producer.SendResult;  
  6. import com.alibaba.rocketmq.client.producer.SendStatus;  
  7. import com.alibaba.rocketmq.common.message.Message;  
  8.   
  9. import java.util.UUID;  
  10.   
  11. /** 
  12.  * 生产者
  13.  */  
  14. public class RocketMQProducer {  
  15.   
  16.     private DefaultMQProducer sender;  
  17.   
  18.     protected String nameServer;  
  19.   
  20.     protected String groupName;  
  21.   
  22.     protected String topics;  
  23.   //初始化生产者
  24.     public void init() {  
  25.         sender = new DefaultMQProducer(groupName);  
  26.         sender.setNamesrvAddr(nameServer);  
  27.         sender.setInstanceName(UUID.randomUUID().toString());  
  28.         try {  
  29.             sender.start();   //启动生产者
  30.         } catch (MQClientException e) {  
  31.             e.printStackTrace();  
  32.         }  
  33.     }  
  34.   
  35.     public RocketMQProducer(String nameServer, String groupName, String topics) {  
  36.         this.nameServer = nameServer;  
  37.         this.groupName = groupName;  
  38.         this.topics = topics;  
  39.     }  
  40.   //发送消息
  41.     public void send(Message message) {  
  42.   
  43.         message.setTopic(topics);  
  44.   
  45.         try {  
  46.             SendResult result = sender.send(message);  
  47.             SendStatus status = result.getSendStatus();  
  48.             System.out.println("messageId=" + result.getMsgId() + ", status=" + status);  
  49.         } catch (Exception e) {  
  50.             e.printStackTrace();  
  51.         }  
  52.     }  
  53. }  

       五、测试RocketMQ的消费 RocketMQConsumerTest.java

[java] view plain copy

  1. package com.lance.rocketMQ.RocketMQ;  
  2.   
  3. /** 
  4.  * 测试消费者
  5.  */  
  6. public class RocketMQConsumerTest {  
  7.   
  8.   
  9.     public static void main(String[] args) {  
  10.   
  11.   
  12.         String mqNameServer = "172.10.254.2:9876";  //注册地址
  13.         String mqTopics = "MQ-MSG-TOPICS-TEST";  //主题
  14.   
  15.         String consumerMqGroupName = "CONSUMER-MQ-GROUP";  //消费组
  16.         RocketMQListener mqListener = new RocketMQListener();  
  17.         RocketMQConsumer mqConsumer = new RocketMQConsumer(mqListener, mqNameServer, consumerMqGroupName, mqTopics);  
  18.         mqConsumer.init();  //调用消费者
  19.   
  20.   
  21.         try {  
  22.             Thread.sleep(1000 * 60L);  
  23.         } catch (InterruptedException e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.   
  27.     }  
  28. }  

          run RocketMQConsumerTest.java 之后,控制台输出:

       

[java] view plain copy

  1. RocketMQConsumer Started! group=CONSUMER-MQ-GROUP instance=1eb7d308-4414-4658-90b5-e2cae3b793eb  

            结果分析: 此时MQ对应的TOPIC中并没有响应的消息,故收不到消息,仅看到MQ消费者正常启动信息。

       

        六、MQ的生产者测试类:RocketMQProducerTest.java

       

[java] view plain copy

  1. package com.lance.rocketMQ.RocketMQ;  
  2.   
  3. import com.alibaba.rocketmq.common.message.Message;  
  4.   
  5. /** 
  6.  * 生产者测试
  7.  */  
  8. public class RocketMQProducerTest {  
  9.   
  10.     public static void main(String[] args) {  
  11.   
  12.         String mqNameServer = "172.10.254.2:9876";  //生产者注册地址
  13.         String mqTopics = "MQ-MSG-TOPICS-TEST";  //主题
  14.   
  15.         String producerMqGroupName = "PRODUCER-MQ-GROUP";  //生产者group
  16.         RocketMQProducer mqProducer = new RocketMQProducer(mqNameServer, producerMqGroupName, mqTopics);  
  17.         mqProducer.init();  
  18.   
  19.   
  20.         for (int i = 0; i < 5; i++) {  
  21.   
  22.             Message message = new Message();  
  23.             message.setBody(("I send message to RocketMQ " + i).getBytes());  
  24.             mqProducer.send(message);  //发送消息
  25.         }  
  26.   
  27.   
  28.   
  29.     }  
  30.   
  31. }  

          run RocketMQProducerTest.java 之后,RocketMQProducerTest.java 对应的控制台输出为:

                

[java] view plain copy

  1. messageId=0A71290100002A9F00000003D0BB0832, status=SEND_OK  
  2. messageId=0A71290100002A9F00000003D0BB08BB, status=SEND_OK  
  3. messageId=0A71290100002A9F00000003D0BB0944, status=SEND_OK  
  4. messageId=0A71290100002A9F00000003D0BB09CD, status=SEND_OK  
  5. messageId=0A71290300002A9F000000005440AEED, status=SEND_OK  

         结果分析:表明所有消息都已经正常发送,且被RocketMQ正常接收。

          此时查看RocketMQConsumerTest.java对应的控制台输出发生改变,输出内容变更如下:

         

[java] view plain copy

  1. RocketMQConsumer Started! group=CONSUMER-MQ-GROUP instance=1eb7d308-4414-4658-90b5-e2cae3b793eb  
  2. msg data from rocketMQ:I send message to RocketMQ 1  
  3. msg data from rocketMQ:I send message to RocketMQ 0  
  4. msg data from rocketMQ:I send message to RocketMQ 3  
  5. msg data from rocketMQ:I send message to RocketMQ 2  
  6. msg data from rocketMQ:I send message to RocketMQ 4  

猜你喜欢

转载自blog.csdn.net/weixin_39115437/article/details/81188614
今日推荐