详解RocketMQ中的Producer

上一篇博客讲解了如何安装RocketMQ,并且也简单的介绍了一下相关RocketMq的概念,那么这篇博客,来剖析一下MQ中的producer的角色,看看它是来干什么的?


 


 上图就是MQ中Producer的有关结构图,下面来着重分析一下每个类的用途


 1.MQAdmin:作为MQ应用层最底层的类,为我们提供了所有公共的方法,常用的有如下

 根据key、主题名和队列来创建Topic


 void createTopic(final String key, final String newTopic, final int queueNum) throws MQClientException;

 查询消息队列中的偏移量

 long maxOffset(final MessageQueue mq) throws MQClientException;

 根据各种条件来查询Message信息

 QueryResult queryMessage(final String topic, final String key, final int maxNum, final long begin,
                             final long end) throws MQClientException, InterruptedException;



 2.MQProducer:用来发送生产者中的消息,包含了start和shutdown以及各种send方法,其中send方法返回值为sendResult,里面包含着SendStatus也就是发送的状态。send 消息方法,只要不抛异常,就代表发送成功。但是发送成功会有多个状态,在 sendResult 里定义。 


  SEND_OK 
消息发送成功 
  FLUSH_DISK_TIMEOUT 
消息发送成功,但是服务器刷盘超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失 
  FLUSH_SLAVE_TIMEOUT 
消息发送成功,但是服务器同步到 Slave 时超时,消息已经进入服务器队列,只有此时服务器宕机,消
息才会丢失 
  SLAVE_NOT_AVAILABLE 
消息发送成功,但是此时 slave 不可用,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢


 3.ClientConfig:Client端公共的配置信息,例如心跳数、持久化的时间间隔等

 4.DefaultMQProducer:基础的MQProducer,有一些基本的默认设置,供我们使用。例如默认的队列数目、默认的超时时间等


 

下面通过一个实例来了解一下Producer中常用的操作

 

[java]  view plain  copy
 print ?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">/**      
  2.  * @FileName: Producer.java    
  3.  * @Package:com.test    
  4.  * @Description: TODO   
  5.  * @author: LUCKY     
  6.  * @date:2015年12月28日 下午2:32:22    
  7.  * @version V1.0      
  8.  */  
  9. package com.test;  
  10.   
  11. import java.util.List;  
  12.   
  13. import com.alibaba.rocketmq.client.producer.DefaultMQProducer;  
  14. import com.alibaba.rocketmq.client.producer.SendCallback;  
  15. import com.alibaba.rocketmq.client.producer.SendResult;  
  16. import com.alibaba.rocketmq.common.message.Message;  
  17. import com.alibaba.rocketmq.common.message.MessageQueue;  
  18.   
  19. /** 
  20.  * @ClassName: Producer 
  21.  * @Description: 模拟生产者 
  22.  * @author: LUCKY 
  23.  * @date:2015年12月28日 下午2:32:22 
  24.  */  
  25. public class ProducerTest {  
  26.     public static void main(String[] args) throws Exception {  
  27.   
  28.         DefaultMQProducer producer = new DefaultMQProducer("Producer");  
  29.         // 必须要设置nameserver地址  
  30.         producer.setNamesrvAddr("100.66.154.81:9876");  
  31.         try {  
  32. //          producer.setClientIP("**");  
  33.             //设置实例名称  
  34.             producer.setInstanceName("dd");  
  35.             //设置重试的次数  
  36.             producer.setRetryTimesWhenSendFailed(3);  
  37.             //开启生产者  
  38.             producer.start();  
  39.             //创建一条消息  
  40.             Message msg = new Message("PushTopic""push""1",  
  41.                     "内容一".getBytes());  
  42.             //发送消息  
  43.             SendResult result = producer.send(msg);  
  44.             //发送,并触发回调函数  
  45.             producer.send(msg, new SendCallback() {  
  46.                   
  47.                 @Override  
  48.                 //成功的回调函数  
  49.                 public void onSuccess(SendResult sendResult) {  
  50.                     System.out.println(sendResult.getSendStatus());  
  51.                     System.out.println("成功了");  
  52.                 }  
  53.                   
  54.                 @Override  
  55.                 //出现异常的回调函数  
  56.                 public void onException(Throwable e) {  
  57.                 System.out.println("失败了"+e.getMessage());  
  58.                       
  59.                 }  
  60.             });  
  61.           
  62.               
  63.             //获取某个主题的消息队列  
  64.             List<MessageQueue> messageQueues = producer  
  65.                     .fetchPublishMessageQueues("PushTopic");  
  66.             System.out.println(messageQueues.size());  
  67.           
  68.         } catch (Exception e) {  
  69.             e.printStackTrace();  
  70.         } finally {  
  71.               
  72.          producer.shutdown();  
  73.         }  
  74.     }  
  75.   
  76. }  
  77. </span>  
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页