成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

三分鐘學會在 RabbitMQ 中實現發布訂閱模式

開發 前端
掌握發布-訂閱模式和消息發送失敗處理策略,對于掌握消息隊列的使用至關重要,可為系統的穩定性和擴展性提供保障。

在這個充滿挑戰和收獲的60天學習之旅中,你將迅速提升成為一名全棧工程師。專注于Spring Boot框架,我們將深入研究高級特性,從項目初始化到微服務架構,再到性能優化和持續集成部署。無論你是初學者還是有一定經驗的開發者,這個專題都將帶你穿越從零到全面掌握Spring Boot的學習曲線。

Day 32 ~ Springboot3.1.x|3分鐘學會在 RabbitMQ 中實現發布訂閱模式

實現發布與訂閱消息模式

發布-訂閱模式是一種消息傳遞方式,其中發送者(發布者)不會將消息直接發送到特定的接收者(訂閱者)。發布者類別定義了哪些訂閱者因為訂閱者匹配了發布者的類別而接收消息。

以下是使用RabbitMQ實現發布-訂閱模式的一種例子,我們將使用RabbitMQ的Fanout Exchange。

Producer

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.nio.charset.StandardCharsets;

public class EmitLog {

  private static final String EXCHANGE_NAME = "logs";

  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    try (Connection connection = factory.newConnection();
         Channel channel = connection.createChannel()) {
        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

        String message = "Log message...";

        channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes(StandardCharsets.UTF_8));
        System.out.println("Sent '" + message + "'");
    }
  }
}

在上述代碼的channel.exchangeDeclare(EXCHANGE_NAME, "fanout"),我們聲明一個名為"log"的exchange,同時我們定義其類型為"fanout",意味著它會將接收到的所有消息廣播給所有它所知道的隊列。

Consumer

每一個訂閱者都需要擁有一個queue,因此,我們需要在客戶端中創建queue。

import com.rabbitmq.client.*;
import java.io.IOException;

public class ReceiveLogs {

  private static final String EXCHANGE_NAME = "logs";

  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
    String queueName = channel.queueDeclare().getQueue();
    channel.queueBind(queueName, EXCHANGE_NAME, "");

    DeliverCallback deliverCallback = (consumerTag, delivery) -> {
        String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
        System.out.println("Received '" + message + "'");
    };
    channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
  }
}

在這個例子中,我們聲明一個新的queue,并將其與"logs"的exchange綁定。然后我們定義了消息的接收以及處理方式。

處理消息發送失敗的情況

在使用消息中間件的過程中,消息發送失敗是無法避免的情況。因此,我們需要對此進行正確的處理以避免因此而導致的系統問題。

對于消息發送失敗的處理,有以下幾種常用的方案:

  • 重試: 對于有些暫時的問題,比如網絡波動,可以通過簡單的重試來解決。
  • 消息持久化:將消息存儲在某處(例如數據庫),只有當消息成功發送后,再刪除它。
  • 死信隊列:把無法處理的消息放入"死信隊列",然后由專門的消費者來進行處理。

RabbitMQ中的消息確認(publisher confirms)和消費者應答(Consumer Acknowledgements)就是為了解決此類問題。

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection()) {
    Channel channel = connection.createChannel();

    String queueName = "test";
    String message = "Hello world";
    try {
        channel.queueDeclare(queueName, false, false, false, null);
        channel.confirmSelect();

        channel.basicPublish("", queueName, null, message.getBytes());
        if (!channel.waitForConfirms()) {
            System.out.println("消息發送失敗");
        }
    } catch (Exception e) {
        System.out.println("錯誤: " + e.getMessage());
    }
}

上述代碼中執行channel.confirmSelect();后,當前channel被設置為publisher confirm模式。在此模式下,當消息被RabbitMQ成功接收后,會發送一個確認給生產者。如果RabbitMQ沒有發送確認,那么生產者可以認定該消息發送失敗。

結論:掌握發布-訂閱模式和消息發送失敗處理策略,對于掌握消息隊列的使用至關重要,可為系統的穩定性和擴展性提供保障。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2024-04-01 09:59:08

消息隊列通信微服務

2009-11-17 10:13:29

PHP正則表達式

2009-10-26 19:09:50

VB.NET轉換形態

2021-10-22 09:09:43

Windows 11操作系統微軟

2024-03-07 07:38:59

微服務HTTP客戶端

2025-02-12 12:45:06

2024-03-11 09:03:12

客戶端負載均衡Ribbon

2024-04-02 08:27:19

異步任務抽象

2021-09-16 10:29:05

開發技能代碼

2024-05-16 11:13:16

Helm工具release

2009-11-09 12:55:43

WCF事務

2024-12-18 10:24:59

代理技術JDK動態代理

2024-08-30 08:50:00

2022-02-17 09:24:11

TypeScript編程語言javaScrip

2024-01-16 07:46:14

FutureTask接口用法

2021-04-20 13:59:37

云計算

2023-12-27 08:15:47

Java虛擬線程

2020-06-30 10:45:28

Web開發工具

2013-06-28 14:30:26

棱鏡計劃棱鏡棱鏡監控項目

2024-06-06 08:50:43

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美又大粗又爽又黄大片视频 | 亚洲精品视频在线播放 | av网站免费观看 | 欧美三级在线 | 免费精品久久久久久中文字幕 | 精品99爱视频在线观看 | 亚洲视频免费 | 久久国产精品一区二区三区 | 少妇一级淫片免费放播放 | re久久| 国内精品视频一区二区三区 | 精品视频在线观看 | 国产伦精品一区二区三区视频金莲 | 亚洲精品一区二区 | 国产精品久久久久久亚洲调教 | 亚洲成人免费 | 久久久影院 | 久久亚洲一区二区 | 国产成人啪免费观看软件 | 91资源在线 | 久久精品在线免费视频 | 99亚洲 | 欧美一区二区三区在线看 | 日本免费一区二区三区 | 在线不卡一区 | 噜噜噜噜狠狠狠7777视频 | 亚洲欧美精品久久 | 国产在线对白 | 自拍 亚洲 欧美 老师 丝袜 | 在线视频日韩 | 蜜桃精品视频在线 | 亚洲国产精品99久久久久久久久 | 亚洲日韩第一页 | 91免费版在线 | 91精品国产综合久久久亚洲 | 日韩毛片免费看 | 亚洲精品欧美 | 日韩av在线播 | 国产精品久久久久久久久图文区 | 久久中文一区二区 | 欧美一区二区在线观看 |