亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring Boot系列教程之死信隊列詳解

 更新時間:2018年11月12日 14:13:58   作者:JackieZheng  
這篇文章主要給大家介紹了關(guān)于Spring Boot系列教程之死信隊列的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在說死信隊列之前,我們先介紹下為什么需要用死信隊列。

如果想直接了解死信對接,直接跳入下文的"死信隊列"部分即可。

ack機制和requeue-rejected屬性

我們還是基于上篇《Spring Boot系列——7步集成RabbitMQ》的demo代碼來說。

在項目springboot-demo我們看到application.yaml文件部分配置內(nèi)容如下

...

listener:
 type: simple
 simple:
  acknowledge-mode: auto
  concurrency: 5
  default-requeue-rejected: true
  max-concurrency: 100
...

其中

acknowledge-mode

該配置項是用來表示消息確認方式,其有三種配置方式,分別是none、manual和auto。

none意味著沒有任何的應(yīng)答會被發(fā)送。

manual意味著監(jiān)聽者必須通過調(diào)用Channel.basicAck()來告知所有的消息。

auto意味著容器會自動應(yīng)答,除非MessageListener拋出異常,這是默認配置方式。

default-requeue-rejected

該配置項是決定由于監(jiān)聽器拋出異常而拒絕的消息是否被重新放回隊列。默認值為true。

我一開始對于這個屬性有個誤解,我以為rejected是表示拒絕,所以將requeue-rejected連起來是拒絕重新放回隊列,后來查了資料明白這個屬性的功能才想起來rejected是個形容詞,其表示的應(yīng)該是被拒絕的消息

所以如果該屬性配置為true表示會重新放回隊列,如果配置為false表示不會放回隊列。

下面我們看看acknowledge-mode參數(shù)和default-requeue-rejected參數(shù)使用不同的組合方式,RabbitMQ是如何處理消息的。

代碼依然使用springboot-demo中的RabbitApplicationTests發(fā)送消息,使用Receiver類監(jiān)聽demo-queue隊列的消息。

對于Receiver類添加了一行代碼,該代碼模擬拋出異常

@Component
public class Receiver {

 @RabbitListener(queues = "demo_queue")
 public void created(String message) {
  System.out.println("orignal message: " + message);
  int i = 1/0;
 }
}

acknowledge-mode=none, default-requeue-rejected=false

該配置不會確認消息是否正常消費,所以在控制臺沒有拋出任何異常。通過在RabbitMQ管理頁面也沒有看到重新放回隊列的消息

acknowledge-mode=none, default-requeue-rejected=true

同樣該配置不會確認消息是否正常消費,所以在控制臺沒有拋出任何異常。而且即使default-requeue-rejected配置為true因為沒有確認所以也沒有看到重新放回隊列的消息

acknowledge-mode=manual, default-requeue-rejected=false

該配置需要手動確認消息是否正常消費,但是代碼中并沒有手動確認,個人理解是因為沒有收到ack,所以消息又回到了隊列中。

acknowledge-mode=manual, default-requeue-rejected=true

該配置需要手動確認消息是否正常消費,但是代碼中并沒有手動確認,所以消息被重新放入到隊列中了,并且在控制臺發(fā)現(xiàn)還拋出了異常(這塊不是很清楚,default-requeue-rejected設(shè)置true和false帶來的不同效果,有了解的麻煩下方留言指教)。

acknowledge-mode=auto, default-requeue-rejected=false

該配置采用自動確認,從結(jié)果來看,是自動確認了。

從控制臺打印的結(jié)果可以看出Receiver方法執(zhí)行了3次,分別是前面兩條放回隊列的消息以及這次發(fā)送的消息,所以3條消息都消費了。

同時因為default-requeue-rejected設(shè)置為false,所以即使消費拋出異常,也沒有將消息放回隊列。

acknowledge-mode=auto, default-requeue-rejected=true

該配置同樣采用自動確認,從結(jié)果看出,沒有拋出異常(這塊也不是很理解),且因為default-requeue-rejected設(shè)置為true,所以消息重新回到隊列。

綜上羅列這么多情況只為說明有些情況下,如果消息消費出錯,因為配置問題導(dǎo)致消息丟失了。這在很多情況下是要命的,比如用戶支付的訂單號,如果因為拋異常等原因直接丟失是很要命的。

所以,我們需要有一個確保機制,能夠保證即使失敗的消息也能保存下來,這時候死信隊列就排上用場了。

死信隊列

死信隊列的整個設(shè)計思路是這樣的

生產(chǎn)者 --> 消息 --> 交換機 --> 隊列 --> 變成死信 --> DLX交換機 -->隊列 --> 消費者

下面我們通過網(wǎng)上的一個簡單的死信隊列的實現(xiàn)看看如何使用死信隊列。

@Bean("deadLetterExchange")
 public Exchange deadLetterExchange() {
  return ExchangeBuilder.directExchange("DL_EXCHANGE").durable(true).build();
 }

 @Bean("deadLetterQueue")
 public Queue deadLetterQueue() {
  Map<String, Object> args = new HashMap<>(2);
//  x-dead-letter-exchange 聲明 死信交換機
  args.put("x-dead-letter-exchange", "DL_EXCHANGE");
//  x-dead-letter-routing-key 聲明 死信路由鍵
  args.put("x-dead-letter-routing-key", "KEY_R");
  return QueueBuilder.durable("DL_QUEUE").withArguments(args).build();
 }

 @Bean("redirectQueue")
 public Queue redirectQueue() {
  return QueueBuilder.durable("REDIRECT_QUEUE").build();
 }

 /**
  * 死信路由通過 DL_KEY 綁定鍵綁定到死信隊列上.
  *
  * @return the binding
  */
 @Bean
 public Binding deadLetterBinding() {
  return new Binding("DL_QUEUE", Binding.DestinationType.QUEUE, "DL_EXCHANGE", "DL_KEY", null);

 }

 /**
  * 死信路由通過 KEY_R 綁定鍵綁定到死信隊列上.
  *
  * @return the binding
  */
 @Bean
 public Binding redirectBinding() {
  return new Binding("REDIRECT_QUEUE", Binding.DestinationType.QUEUE, "DL_EXCHANGE", "KEY_R", null);
 }

注意

聲明了一個direct模式的exchange。

聲明了一個死信隊列deadLetterQueue,該隊列配置了一些屬性x-dead-letter-exchange表明死信交換機,x-dead-letter-routing-key表明死信路由鍵,因為是direct模式,所以需要設(shè)置這個路由鍵。

聲明了一個替補隊列redirectQueue,變成死信的消息最終就是存放在這個隊列的。

聲明綁定關(guān)系,分別是死信隊列以及替補隊列和交換機的綁定。

那么如何模擬生成一個死信消息呢,可以在發(fā)送到DL_QUEUE的消息在10秒后失效,然后轉(zhuǎn)發(fā)到替補隊列中,代碼實現(xiàn)如下

public void sendMsg(String content) {
  CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
  MessagePostProcessor messagePostProcessor = message -> {
   MessageProperties messageProperties = message.getMessageProperties();
//   設(shè)置編碼
   messageProperties.setContentEncoding("utf-8");
//   設(shè)置過期時間10*1000毫秒
   messageProperties.setExpiration("5000");
   return message;
  };
  rabbitTemplate.convertAndSend("DL_EXCHANGE", "DL_KEY", content, messagePostProcessor);
 }

執(zhí)行結(jié)果如下

消息首先進入DL_QUEUE,5秒后失效,被轉(zhuǎn)發(fā)到REDIRECT_QUEUE中。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • java輸入輸出與方法詳細代碼示例

    java輸入輸出與方法詳細代碼示例

    本文詳細介紹了Java中的輸出方法如println、print和printf,以及輸入的Scanner類使用方法,同時,介紹了Random類生成隨機數(shù)、方法定義、形參和實參關(guān)系、遞歸等概念和使用方式,為編程初學(xué)者提供了全面的Java編程基礎(chǔ)知識,需要的朋友可以參考下
    2024-09-09
  • Maven依賴管理的用法介紹

    Maven依賴管理的用法介紹

    依賴管理是項目管理中非常重要的一環(huán)。幾乎任何項目開發(fā)的時候需要都需要使用到庫。而這些庫很可能又依賴別的庫,這樣整個項目的依賴形成了一個樹狀結(jié)構(gòu),而隨著這個依賴的樹的延伸和擴大,一系列問題就會隨之產(chǎn)生
    2022-08-08
  • 詳解Spring框架之基于Restful風(fēng)格實現(xiàn)的SpringMVC

    詳解Spring框架之基于Restful風(fēng)格實現(xiàn)的SpringMVC

    這篇文章主要介紹了詳解Spring框架之基于Restful風(fēng)格實現(xiàn)的SpringMVC,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java接口測試Cookie與token原理解析

    Java接口測試Cookie與token原理解析

    這篇文章主要介紹了Java接口測試Cookie與token原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 詳解Spring-Boot集成Spring session并存入redis

    詳解Spring-Boot集成Spring session并存入redis

    這篇文章主要介紹了詳解Spring-Boot集成Spring session并存入redis,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • SpringBoot中進行事務(wù)回滾的方法

    SpringBoot中進行事務(wù)回滾的方法

    在Spring Boot中,可以使用TransactionTemplate或@Transactional注解來進行事務(wù)管理,本文主要介紹了SpringBoot中進行事務(wù)回滾的方法,感興趣的可以了解一下
    2023-11-11
  • SpringBoot實現(xiàn)使用反射模擬IOC和getBean

    SpringBoot實現(xiàn)使用反射模擬IOC和getBean

    這篇文章主要介紹了SpringBoot實現(xiàn)使用反射模擬IOC和getBean,IOC就是spring的核心思想之一——控制反轉(zhuǎn)。這里不再贅述,看此文章即可了解
    2023-04-04
  • 在SpringBoot中實現(xiàn)一個訂單號生成系統(tǒng)的示例代碼

    在SpringBoot中實現(xiàn)一個訂單號生成系統(tǒng)的示例代碼

    在Spring Boot中設(shè)計一個訂單號生成系統(tǒng),主要考慮到生成的訂單號需要滿足的幾個要求:唯一性、可擴展性、以及可能的業(yè)務(wù)相關(guān)性,本文給大家介紹了幾種常見的解決方案及相應(yīng)的示例代碼,需要的朋友可以參考下
    2024-02-02
  • java 獲取日期的幾天前,幾個月前和幾年前的實例

    java 獲取日期的幾天前,幾個月前和幾年前的實例

    下面小編就為大家?guī)硪黄猨ava 獲取日期的幾天前,幾個月前和幾年前的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java編程實現(xiàn)漢字按字母順序排序的方法示例

    Java編程實現(xiàn)漢字按字母順序排序的方法示例

    這篇文章主要介紹了Java編程實現(xiàn)漢字按字母順序排序的方法,結(jié)合具體實例形式分析了java編碼轉(zhuǎn)換及字母排序相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07

最新評論