1. 程式人生 > >詳解RocketMQ中的Producer

詳解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>  
           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow