SpringCloud 2020.0.4 系列之 Stream 消息出錯(cuò)重試 與 死信隊(duì)列 的實(shí)現(xiàn)

1. 概述

老話說的好:出錯(cuò)不怕劲阎,怕的是出了錯(cuò),卻不去改正鸠真。如果屢次出錯(cuò)悯仙,無法改對,就先記下了吠卷,然后找援軍解決锡垄。

言歸正傳,今天來聊一下 Stream 組件的 出錯(cuò)重試 和 死信隊(duì)列撤嫩。

RabbitMQ 鏡像模式集群的搭建偎捎,可參見我的另一篇文章《RabbitMQ 3.9.7 鏡像模式集群的搭建》(http://www.reibang.com/p/187325419e95

在早期的 SpringCloud 版本中常使用 @Input、@Output序攘、@EnableBinding 和 @StreamListener 注解開發(fā)生產(chǎn)者與消費(fèi)者。

官方原文:Deprecated as of 3.1 in favor of functional programming model寻拂。

SpringCloud 2020.0.4 版本中程奠,已經(jīng)不推薦這么開發(fā)了,因此這里我們也使用新的寫法(函數(shù)式編程方式) 開發(fā)祭钉。

閑話不多說瞄沙,直接上代碼。

2. 消息出錯(cuò)重試

2.1 主要依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 健康檢查 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>

2.2 消息實(shí)體類

@Setter
@Getter
public class MyMessage implements java.io.Serializable {

    // 消息體
    private String payload;
}

2.3 生產(chǎn)者

    // 消息出錯(cuò)重試
    @GetMapping("/retry")
    public String sendRetryMessage(@RequestParam("body") String body) {

        MyMessage myMessage = new MyMessage();
        myMessage.setPayload(body);

        // 生產(chǎn)消息
        // 第一個(gè)參數(shù)是綁定名稱,格式為:自定義的綁定名稱-out-0距境,myRetry是自定義的綁定名稱申尼,out代表生產(chǎn)者,0是固定寫法
        // 自定義的綁定名稱必須與消費(fèi)方法的方法名保持一致
        // 第二個(gè)參數(shù)是發(fā)送的消息實(shí)體
        streamBridge.send("myRetry-out-0", myMessage);
        return "SUCCESS";
    }

2.4 消費(fèi)者

    // 消息出錯(cuò)重試
    @Bean
    public Consumer<MyMessage> myRetry() {  // 方法名必須與生產(chǎn)消息時(shí)自定義的綁定名稱一致

        return message -> {
            log.info("接收消息:{}", message.getPayload());
            throw new RuntimeException("消費(fèi)報(bào)錯(cuò)");
        };
    }

2.5 application.yml 配置

spring:
  application:
    name: my-stream-new
  rabbitmq:   # RabbitMQ 配置
    addresses: 192.168.1.12:5672
    username: guest
    password: guest
    virtual-host: /
    connection-timeout: 16000
  cloud:
    function:
      # 定義消費(fèi)者垫桂,多個(gè)用分號(hào)分隔师幕,當(dāng)存在大于1個(gè)的消費(fèi)者時(shí),不定義不會(huì)生效
      definition: myRetry
    stream:
      bindings:
        # 消息出錯(cuò)重試
        myRetry-in-0:
          destination: my-retry-topic
          # 配置重試次數(shù)(本機(jī)重試)
          # 次數(shù)等于 1 诬滩,相當(dāng)于不重試
          consumer:
            max-attempts: 3
        myRetry-out-0:
          destination: my-retry-topic

2.6 驗(yàn)證消息出錯(cuò)重試

發(fā)送消息接口:

Get http://localhost:49000/stream/retry?body=出錯(cuò)重試消息

自動(dòng)生成的 Exchange

image

自動(dòng)生成的 Queue

image

消費(fèi)情況

image

3. 死信隊(duì)列

3.1 生產(chǎn)者

    // 死信隊(duì)列
    @GetMapping("/dlq")
    public String sendDlqMessage(@RequestParam("body") String body) {

        MyMessage myMessage = new MyMessage();
        myMessage.setPayload(body);

        // 生產(chǎn)消息
        // 第一個(gè)參數(shù)是綁定名稱霹粥,格式為:自定義的綁定名稱-out-0,myDlq是自定義的綁定名稱疼鸟,out代表生產(chǎn)者后控,0是固定寫法
        // 自定義的綁定名稱必須與消費(fèi)方法的方法名保持一致
        // 第二個(gè)參數(shù)是發(fā)送的消息實(shí)體
        streamBridge.send("myDlq-out-0", myMessage);
        return "SUCCESS";
    }

3.2 消費(fèi)者

    // 死信隊(duì)列
    @Bean
    public Consumer<MyMessage> myDlq() {  // 方法名必須與生產(chǎn)消息時(shí)自定義的綁定名稱一致

        return message -> {
            log.info("接收消息:{}", message.getPayload());
            throw new RuntimeException("消費(fèi)報(bào)錯(cuò)");
        };
    }

3.3 application.yml 配置

spring:
  application:
    name: my-stream-new
  rabbitmq:   # RabbitMQ 配置
    addresses: 192.168.1.12:5672
    username: guest
    password: guest
    virtual-host: /
    connection-timeout: 16000
  cloud:
    function:
      # 定義消費(fèi)者,多個(gè)用分號(hào)分隔空镜,當(dāng)存在大于1個(gè)的消費(fèi)者時(shí)浩淘,不定義不會(huì)生效
      definition: myRetry;myDlq
    stream:
      bindings:       
        # 消息出錯(cuò)重試
        myRetry-in-0:
          destination: my-retry-topic
          # 配置重試次數(shù)(本機(jī)重試)
          # 次數(shù)等于 1 ,相當(dāng)于不重試
          consumer:
            max-attempts: 3
        myRetry-out-0:
          destination: my-retry-topic

        # 死信隊(duì)列
        myDlq-in-0:
          destination: my-dlq-topic
          group: dlq-group
          # 配置重試次數(shù)(本機(jī)重試)
          # 次數(shù)等于 1 吴攒,相當(dāng)于不重試
          consumer:
            max-attempts: 3
        myDlq-out-0:
          destination: my-dlq-topic

      rabbit:
        bindings:
          # 死信隊(duì)列
          myDlq-in-0:
            consumer:
              autoBindDlq: true   # 自動(dòng)綁定死信隊(duì)列馋袜,會(huì)自動(dòng)創(chuàng)建一個(gè)默認(rèn)的死信隊(duì)列
          myDlq-out-0:
            producer:
              autoBindDlq: true   # 自動(dòng)綁定死信隊(duì)列,會(huì)自動(dòng)創(chuàng)建一個(gè)默認(rèn)的死信隊(duì)列

3.4 驗(yàn)證死信隊(duì)列

發(fā)送消息接口:

GET http://localhost:49000/stream/dlq?body=死信隊(duì)列

自動(dòng)生成的 Exchange

image

自動(dòng)生成的 Queue

image

消費(fèi)情況

image

死信隊(duì)列情況

image

4. 綜述

今天聊了一下 SpringCloud Stream 組件 消息出錯(cuò)重試 與 死信隊(duì)列 的實(shí)現(xiàn) 舶斧,希望可以對大家的工作有所幫助欣鳖。

歡迎幫忙點(diǎn)贊、評論茴厉、轉(zhuǎn)發(fā)泽台、加關(guān)注 :)

關(guān)注追風(fēng)人聊Java,每天更新Java干貨矾缓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怀酷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗜闻,更是在濱河造成了極大的恐慌蜕依,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琉雳,死亡現(xiàn)場離奇詭異样眠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翠肘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門檐束,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人束倍,你說我怎么就攤上這事被丧∶讼罚” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵甥桂,是天一觀的道長柿究。 經(jīng)常有香客問我,道長黄选,這世上最難降的妖魔是什么蝇摸? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮糕簿,結(jié)果婚禮上探入,老公的妹妹穿的比我還像新娘。我一直安慰自己懂诗,他們只是感情好蜂嗽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布蛉威。 她就那樣靜靜地躺著斋否,像睡著了一般下硕。 火紅的嫁衣襯著肌膚如雪拼窥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天嗤疯,我揣著相機(jī)與錄音闯传,去河邊找鬼峰髓。 笑死亥鬓,一個(gè)胖子當(dāng)著我的面吹牛完沪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嵌戈,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼覆积,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熟呛?” 一聲冷哼從身側(cè)響起宽档,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庵朝,沒想到半個(gè)月后吗冤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡九府,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年椎瘟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昔逗。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡降传,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勾怒,到底是詐尸還是另有隱情婆排,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布笔链,位于F島的核電站段只,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鉴扫。R本人自食惡果不足惜赞枕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坪创。 院中可真熱鬧炕婶,春花似錦、人聲如沸莱预。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽依沮。三九已至涯贞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間危喉,已是汗流浹背宋渔。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辜限,地道東北人皇拣。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像薄嫡,于是被迫代替她去往敵國和親氧急。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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