四迫横、RocketMQ-Producer的Send方法

一番舆、概述

RocketMQ的producer默認(rèn)有兩個,一個是DefaultMQProducer矾踱,另一個是TransactionMQProducer恨狈,本文只對send方法做一個總結(jié),其他的細節(jié)在其他章節(jié)介紹

二呛讲、DefaultMQProducer

一共定義了17種send方法禾怠,從4.x版本,事務(wù)消息被放到了TransactionMQProducer中贝搁,所以有15個send方法吗氏,這15個方法中,又有兩個異步帶超時時間的send方法被廢棄了雷逆,所以有效的send方法有13個:

1弦讽、同步發(fā)送

/**
     * 同步發(fā)送模式. 只有消息被成功接收并且被固化完成后才會收到反饋。
     * 內(nèi)置有重發(fā)機制, producer將會重試
     * {@link #retryTimesWhenSendFailed,default=2} 次 膀哲,然后才會報錯. 
     * 因此往产,有一定的概率向broker發(fā)送重復(fù)的消息
     * 使用者有責(zé)任去解決潛在的重復(fù)數(shù)據(jù)造成的影響
     * @param msg 待發(fā)送數(shù)據(jù)
     * @return {@link SendResult} 實體,來通知發(fā)送者發(fā)送狀態(tài)等信息, 比如消息的ID
     * {@link SendStatus} 指明 broker 存儲/復(fù)制 的狀態(tài), 發(fā)送到了哪個隊列等等
     * @throws MQClientException 客戶端異常
     * @throws RemotingException 網(wǎng)絡(luò)連接異常
     * @throws MQBrokerException broker異常
     * @throws InterruptedException 發(fā)送線程中斷異常
     */
    @Override
    public SendResult send(
        Message msg) throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
        return this.defaultMQProducerImpl.send(msg);
    }

2某宪、同步發(fā)送仿村,帶超時時間

/**
     * 與 {@link #send(Message)} 相同,只不過多了超時時間的指定.
     *
     * @param msg 待發(fā)送消息
     * @param timeout 發(fā)送超時時間
     * @return {@link SendResult} 同上
     * {@link SendStatus} 同上
     * @throws MQClientException 客戶端異常
     * @throws RemotingException 網(wǎng)絡(luò)連接異常
     * @throws MQBrokerException broker異常
     * @throws InterruptedException 發(fā)送線程中斷異常
     */
    @Override
    public SendResult send(Message msg,long timeout) throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
        return this.defaultMQProducerImpl.send(msg, timeout);
    }

3兴喂、異步發(fā)送

/**
     * 異步發(fā)送消息
     * 消息發(fā)送后蔼囊,立即返回包颁。broker處理返程后, 觸發(fā)sendCallback回調(diào)方法
     * 與上面一樣,在給出發(fā)送失敗標(biāo)志前压真,會嘗試2次娩嚼,所以開發(fā)者要處理重復(fù)發(fā)送帶來的問題
     * @param msg 待發(fā)送消息
     * @param sendCallback 回調(diào)函數(shù)
     * @throws MQClientException 客戶端異常
     * @throws RemotingException 網(wǎng)絡(luò)異常
     * @throws InterruptedException 發(fā)送線程中斷異常
     */
    @Override
    public void send(Message msg,SendCallback sendCallback) throws MQClientException, RemotingException, InterruptedException {
        this.defaultMQProducerImpl.send(msg, sendCallback);
    }

4、異步發(fā)送滴肿,帶超時時間

@Override
    public void send(Message msg, SendCallback sendCallback, long timeout)
        throws MQClientException, RemotingException, InterruptedException {
        this.defaultMQProducerImpl.send(msg, sendCallback, timeout);
    }

5岳悟、單向發(fā)送,不等待broker回饋

/**
     * 發(fā)送方法不會等待broker的反饋泼差,只會一直發(fā)
     * 所以有很高的吞吐量贵少,但是有一定概率丟失消息
     *
     * @param msg 待發(fā)送消息
     * @throws MQClientException 客戶端異常
     * @throws RemotingException 網(wǎng)絡(luò)異常
     * @throws InterruptedException 發(fā)送線程中斷異常
     */
    @Override
    public void sendOneway(Message msg) throws MQClientException, RemotingException, InterruptedException {
        this.defaultMQProducerImpl.sendOneway(msg);
    }

6、同步發(fā)送堆缘,指定隊列

/**
     * 同步發(fā)送滔灶,指定隊列
     * @param msg 待發(fā)送消息
     * @param mq 指定的消息隊列
     * @return {@link SendResult} 同上
     * {@link SendStatus} 同上
     */
    @Override
    public SendResult send(Message msg, MessageQueue mq)
        throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
        return this.defaultMQProducerImpl.send(msg, mq);
    }

7、同步發(fā)送吼肥,指定隊列录平,并附帶超時時間

@Override
    public SendResult send(Message msg, MessageQueue mq, long timeout)
        throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
        return this.defaultMQProducerImpl.send(msg, mq, timeout);
    }

8、異步發(fā)送缀皱,指定隊列

@Override
    public void send(Message msg, MessageQueue mq, SendCallback sendCallback)
        throws MQClientException, RemotingException, InterruptedException {
        this.defaultMQProducerImpl.send(msg, mq, sendCallback);
    }

9斗这、異步發(fā)送,指定隊列啤斗,附帶超時時間

這個在4.4.0版本被設(shè)置為廢棄表箭,后續(xù)版本會給出

/**
  * 因為在處超時異常存在問題,所以廢棄
 */
@Override
    public void send(Message msg, MessageQueue mq, SendCallback sendCallback, long timeout)
        throws MQClientException, RemotingException, InterruptedException {
        this.defaultMQProducerImpl.send(msg, mq, sendCallback, timeout);
    }

10钮莲、單向發(fā)送免钻,指定隊列

@Override
    public void sendOneway(Message msg,
        MessageQueue mq) throws MQClientException, RemotingException, InterruptedException {
        this.defaultMQProducerImpl.sendOneway(msg, mq);
    }

11、同步發(fā)送崔拥,指定隊列選擇策略

官方的有序消息的DEMO就是基于隊列選擇器做的极舔,讓一些列有序的消息(相同ID)發(fā)送到同一個隊列

/**
     * 指定隊列選擇策略MessageQueueSelector 
     *
     * @param msg 待發(fā)送消息
     * @param selector 隊列選擇器
     * @param arg 配合隊列選擇器選擇隊列的參數(shù),一般可以是業(yè)務(wù)參數(shù)(ID等)
     * @return {@link SendResult} 同上
     * {@link SendStatus} 同上
     */
@Override
    public SendResult send(Message msg, MessageQueueSelector selector, Object arg)
        throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
        return this.defaultMQProducerImpl.send(msg, selector, arg);
    }

12握童、同步發(fā)送消息姆怪,指定隊列選擇策略,并附帶超時時間

@Override
    public SendResult send(Message msg, MessageQueueSelector selector, Object arg, long timeout)
        throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
        return this.defaultMQProducerImpl.send(msg, selector, arg, timeout);
    }

13澡绩、異步發(fā)送消息,指定隊列選擇策略

@Override
    public void send(Message msg, MessageQueueSelector selector, Object arg, SendCallback sendCallback)
        throws MQClientException, RemotingException, InterruptedException {
        this.defaultMQProducerImpl.send(msg, selector, arg, sendCallback);
    }

14俺附、異步發(fā)送消息肥卡,指定隊列選擇策略,并附帶超時時間

這個方法在4.4.0版本廢棄事镣,后續(xù)提供

@Override
    public void send(Message msg, MessageQueueSelector selector, Object arg, SendCallback sendCallback, long timeout)
        throws MQClientException, RemotingException, InterruptedException {
        this.defaultMQProducerImpl.send(msg, selector, arg, sendCallback, timeout);
    }

15步鉴、單向發(fā)送,指定隊列選擇策略

 @Override
    public void sendOneway(Message msg, MessageQueueSelector selector, Object arg)
        throws MQClientException, RemotingException, InterruptedException {
        this.defaultMQProducerImpl.sendOneway(msg, selector, arg);
    }

三、TransactionMQProducer

1氛琢、發(fā)送事務(wù)消息

@Override
    public TransactionSendResult sendMessageInTransaction(final Message msg,
        final Object arg) throws MQClientException {
        if (null == this.transactionListener) {
            throw new MQClientException("TransactionListener is null", null);
        }

        return this.defaultMQProducerImpl.sendMessageInTransaction(msg, null, arg);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喊递,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阳似,更是在濱河造成了極大的恐慌骚勘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撮奏,死亡現(xiàn)場離奇詭異俏讹,居然都是意外死亡,警方通過查閱死者的電腦和手機畜吊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門泽疆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玲献,你說我怎么就攤上這事殉疼。” “怎么了捌年?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵株依,是天一觀的道長。 經(jīng)常有香客問我延窜,道長恋腕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任逆瑞,我火速辦了婚禮荠藤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘获高。我一直安慰自己哈肖,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布念秧。 她就那樣靜靜地躺著淤井,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摊趾。 梳的紋絲不亂的頭發(fā)上币狠,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音砾层,去河邊找鬼漩绵。 笑死,一個胖子當(dāng)著我的面吹牛肛炮,可吹牛的內(nèi)容都是我干的止吐。 我是一名探鬼主播宝踪,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碍扔!你這毒婦竟也來了瘩燥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤不同,失蹤者是張志新(化名)和其女友劉穎厉膀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體套鹅,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡站蝠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卓鹿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躏精。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡窘面,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碟渺,我是刑警寧澤嘹叫,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布卓箫,位于F島的核電站埋涧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巷挥。R本人自食惡果不足惜桩卵,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倍宾。 院中可真熱鬧雏节,春花似錦、人聲如沸高职。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怔锌。三九已至寥粹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埃元,已是汗流浹背涝涤。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亚情,地道東北人妄痪。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像楞件,于是被迫代替她去往敵國和親衫生。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容

  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,914評論 2 11
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,101評論 1 32
  • 最全的iOS面試題及答案 iOS面試小貼士 ———————————————回答好下面的足夠了-----------...
    zweic閱讀 2,701評論 0 73
  • 每個人的想法不同 土浸, RocketMQ 介紹的時候就說 是阿里從他們使用的上 解耦出來 近一步簡化 便捷的 目...
    樓亭樵客閱讀 406評論 0 0
  • 1資金分成若干分罪针,不斷地投項目,上線了漲不動就賣黄伊,破發(fā)也賣泪酱。時間耗不起。資金必須滾動还最,對項目要做到拔掉無情墓阀。 2熊...
    于海濤_290e閱讀 175評論 0 0