SpringBoot怎麼整合RabbitMQ處理死信佇列和延遲佇列
簡介
RabbitMQ訊息簡介
RabbitMQ的訊息預設不會逾時。
什麼是死信隊列?什麼是延遲隊列?
死信佇列:
DLX,全稱為Dead-Letter-Exchange,可以稱為死信交換器,也有人稱之為死信郵箱。當訊息在一個佇列變成死信(dead message)之後,它能被重新被傳送到另一個交換器中,這個交換器就是DLX,綁定DLX的佇列就稱為死信佇列。
以下幾種情況會導致訊息變成死信:
訊息被拒絕(Basic.Reject/Basic.Nack),並且設定requeue參數為false;
訊息過期;
佇列達到最大長度。
延遲佇列:
延遲佇列用來存放延遲訊息。延遲訊息:指當訊息被傳送以後,不想讓消費者立刻拿到訊息,而是等待特定時間後,消費者才能拿到這個訊息進行消費。
相關網址
詳解RabbitMQ中死信佇列與延遲佇列的使用詳解
實例程式碼
路由設定
package com.example.config; import org.springframework.amqp.core.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitRouterConfig { public static final String EXCHANGE_TOPIC_WELCOME = "Exchange@topic.welcome"; public static final String EXCHANGE_FANOUT_UNROUTE = "Exchange@fanout.unroute"; public static final String EXCHANGE_TOPIC_DELAY = "Exchange@topic.delay"; public static final String ROUTINGKEY_HELLOS = "hello.#"; public static final String ROUTINGKEY_DELAY = "delay.#"; public static final String QUEUE_HELLO = "Queue@hello"; public static final String QUEUE_HI = "Queue@hi"; public static final String QUEUE_UNROUTE = "Queue@unroute"; public static final String QUEUE_DELAY = "Queue@delay"; public static final Integer TTL_QUEUE_MESSAGE = 5000; @Autowired AmqpAdmin amqpAdmin; @Bean Object initBindingTest() { amqpAdmin.declareExchange(ExchangeBuilder.fanoutExchange(EXCHANGE_FANOUT_UNROUTE).durable(true).autoDelete().build()); amqpAdmin.declareExchange(ExchangeBuilder.topicExchange(EXCHANGE_TOPIC_DELAY).durable(true).autoDelete().build()); amqpAdmin.declareExchange(ExchangeBuilder.topicExchange(EXCHANGE_TOPIC_WELCOME) .durable(true) .autoDelete() .withArgument("alternate-exchange", EXCHANGE_FANOUT_UNROUTE) .build()); amqpAdmin.declareQueue(QueueBuilder.durable(QUEUE_HI).build()); amqpAdmin.declareQueue(QueueBuilder.durable(QUEUE_HELLO) .withArgument("x-dead-letter-exchange", EXCHANGE_TOPIC_DELAY) .withArgument("x-dead-letter-routing-key", ROUTINGKEY_DELAY) .withArgument("x-message-ttl", TTL_QUEUE_MESSAGE) .build()); amqpAdmin.declareQueue(QueueBuilder.durable(QUEUE_UNROUTE).build()); amqpAdmin.declareQueue(QueueBuilder.durable(QUEUE_DELAY).build()); amqpAdmin.declareBinding(new Binding(QUEUE_HELLO, Binding.DestinationType.QUEUE, EXCHANGE_TOPIC_WELCOME, ROUTINGKEY_HELLOS, null)); amqpAdmin.declareBinding(new Binding(QUEUE_UNROUTE, Binding.DestinationType.QUEUE, EXCHANGE_FANOUT_UNROUTE, "", null)); amqpAdmin.declareBinding(new Binding(QUEUE_DELAY, Binding.DestinationType.QUEUE, EXCHANGE_TOPIC_DELAY, ROUTINGKEY_DELAY, null)); return new Object(); } }
控制器
package com.example.controller; import com.example.config.RabbitRouterConfig; import com.example.mq.Sender; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; @RestController public class HelloController { @Autowired private Sender sender; @PostMapping("/hi") public void hi() { sender.send(RabbitRouterConfig.QUEUE_HI, "hi1 message:" + LocalDateTime.now()); } @PostMapping("/hello1") public void hello1() { sender.send("hello.a", "hello1 message:" + LocalDateTime.now()); } @PostMapping("/hello2") public void hello2() { sender.send(RabbitRouterConfig.EXCHANGE_TOPIC_WELCOME, "hello.b", "hello2 message:" + LocalDateTime.now()); } @PostMapping("/ae") public void aeTest() { sender.send(RabbitRouterConfig.EXCHANGE_TOPIC_WELCOME, "nonono", "ae message:" + LocalDateTime.now()); } }
發送器
package com.example.mq; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; @Component public class Sender { @Autowired private AmqpTemplate rabbitTemplate; public void send(String routingKey, String message) { this.rabbitTemplate.convertAndSend(routingKey, message); } public void send(String exchange, String routingKey, String message) { this.rabbitTemplate.convertAndSend(exchange, routingKey, message); } }
接收器
package com.example.mq; import com.example.config.RabbitRouterConfig; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class Receiver { @RabbitListener(queues = RabbitRouterConfig.QUEUE_HI) public void hi(String payload) { System.out.println ("Receiver(hi) : " + payload); } // @RabbitListener(queues = RabbitRouterConfig.QUEUE_HELLO) // public void hello(String hello) throws InterruptedException { // System.out.println ("Receiver(hello) : " + hello); // Thread.sleep(5 * 1000); // System.out.println("(hello):sleep over"); // } // // @RabbitListener(queues = RabbitRouterConfig.QUEUE_UNROUTE) // public void unroute(String hello) throws InterruptedException { // System.out.println ("Receiver(unroute) : " + hello); // Thread.sleep(5 * 1000); // System.out.println("(unroute):sleep over"); // } @RabbitListener(queues = RabbitRouterConfig.QUEUE_DELAY) public void delay(String hello) throws InterruptedException { System.out.println ("Receiver(delay) : " + hello); Thread.sleep(5 * 1000); System.out.println("(delay):sleep over"); } }
application.yml
server: # port: 9100 port: 9101 spring: application: # name: demo-rabbitmq-sender name: demo-rabbitmq-receiver rabbitmq: host: localhost port: 5672 username: admin password: 123456 # virtualHost: / publisher-confirms: true publisher-returns: true # listener: # simple: # acknowledge-mode: manual # direct: # acknowledge-mode: manual
實例測試
分別啟動發送者和接收者。
訪問:http://localhost:9100/hello2
五秒鐘後輸出:
#Receiver(delay) : hello2 message:2020-11- 27T09:30:51.548
(delay):sleep over
以上是SpringBoot怎麼整合RabbitMQ處理死信佇列和延遲佇列的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何利用React和RabbitMQ建立可靠的訊息傳遞應用程式引言:現代化的應用程式需要支援可靠的訊息傳遞,以實現即時更新和資料同步等功能。 React是一種流行的JavaScript庫,用於建立使用者介面,而RabbitMQ是一種可靠的訊息傳遞中間件。本文將介紹如何結合React和RabbitMQ建立可靠的訊息傳遞應用,並提供具體的程式碼範例。 RabbitMQ概述:

如何在PHP中使用RabbitMQ實現分散式訊息處理引言:在大規模應用程式開發中,分散式系統已成為一個常見的需求。分散式訊息處理是這樣的一種模式,透過將任務分發到多個處理節點,可以提高系統的效率和可靠性。 RabbitMQ是一個開源的,可靠的訊息佇列系統,它採用AMQP協定來實現訊息的傳遞和處理。在本文中,我們將介紹如何在PHP中使用RabbitMQ來實現分佈

SpringBoot和SpringMVC都是Java開發中常用的框架,但它們之間有一些明顯的差異。本文將探究這兩個框架的特點和用途,並對它們的差異進行比較。首先,我們來了解一下SpringBoot。 SpringBoot是由Pivotal團隊開發的,它旨在簡化基於Spring框架的應用程式的建立和部署。它提供了一種快速、輕量級的方式來建立獨立的、可執行

隨著現代應用程式的複雜性增加,訊息傳遞已成為一種強大的工具。在這個領域,RabbitMQ已成為一個非常受歡迎的訊息代理,可以用於在不同的應用程式之間傳遞訊息。在這篇文章中,我們將探討如何在Go語言中使用RabbitMQ。本指南將涵蓋以下內容:RabbitMQ簡介RabbitMQ安裝RabbitMQ基礎概念Go語言中的RabbitMQ入門RabbitMQ和Go

本文來寫個詳細的例子來說下dubbo+nacos+Spring Boot開發實戰。本文不會講述太多的理論的知識,會寫一個最簡單的例子來說明dubbo如何與nacos整合,快速建構開發環境。

現在越來越多的企業開始採用微服務架構模式,而在這個架構中,訊息佇列成為一種重要的通訊方式,其中RabbitMQ被廣泛應用。而在go語言中,go-zero是近年來崛起的一種框架,它提供了許多實用的工具和方法,讓開發者更輕鬆地使用訊息佇列,下面我們將結合實際應用,來介紹go-zero和RabbitMQ的使用方法和應用實務。 1.RabbitMQ概述Rabbit

Golang與RabbitMQ實現即時數據同步的解決方案引言:當今時代,隨著互聯網的普及和數據量的爆發式增長,即時數據的同步變得越來越重要。為了解決資料非同步傳輸和資料同步的問題,許多公司開始採用訊息佇列的方式來實現資料的即時同步。本文將介紹基於Golang和RabbitMQ的即時資料同步的解決方案,並提供具體的程式碼範例。一、什麼是RabbitMQ? Rabbi

隨著網路時代的到來,訊息佇列系統變得越來越重要。它可以使不同的應用之間實現非同步操作、降低耦合度、提高可擴展性,進而提升整個系統的效能和使用者體驗。在訊息佇列系統中,RabbitMQ是一個強大的開源訊息佇列軟體,它支援多種訊息協定、被廣泛應用於金融交易、電子商務、線上遊戲等領域。在實際應用中,往往需要將RabbitMQ和其他系統整合。本文將介紹如何使用sw
