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

RabbitMQ的Direct Exchange模式實現(xiàn)的消息發(fā)布案例(示例代碼)

 更新時間:2024年09月12日 10:57:19   作者:Xwzzz_  
本文介紹了RabbitMQ的DirectExchange模式下的消息發(fā)布和消費的實現(xiàn),詳細(xì)說明了如何在DirectExchange模式中進(jìn)行消息的發(fā)送和接收,以及消息處理的基本方法,感興趣的朋友跟隨小編一起看看吧

Producer生產(chǎn)者代碼

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class RabbitMQProducer {
    private final static String EXCHANGE_NAME = "direct_message_exchange";
    private final static String EXCHANGE_TYPE = "direct";
    public static void main(String[] args) {
        // 1. 創(chuàng)建連接工廠,設(shè)置連接參數(shù)
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("localhost");
        connectionFactory.setPort(5672); // RabbitMQ默認(rèn)端口
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        try (Connection connection = connectionFactory.newConnection();
             Channel channel = connection.createChannel()) {
            // 2. 聲明交換機 (direct類型,持久化)
            channel.exchangeDeclare(EXCHANGE_NAME, EXCHANGE_TYPE, true);
            // 3. 聲明隊列 (持久化,非獨占,連接斷開時不自動刪除)
            channel.queueDeclare("queue5", true, false, false, null);
            channel.queueDeclare("queue6", true, false, false, null);
            channel.queueDeclare("queue7", true, false, false, null);
            // 4. 綁定隊列到交換機,設(shè)置路由鍵
            channel.queueBind("queue5", EXCHANGE_NAME, "order");
            channel.queueBind("queue6", EXCHANGE_NAME, "order");
            channel.queueBind("queue7", EXCHANGE_NAME, "course");
            // 5. 準(zhǔn)備要發(fā)送的消息
            String message = "你好,學(xué)相伴:www.kuangstudy.com";
            // 6. 向交換機發(fā)送消息,使用路由鍵 "course"
            channel.basicPublish(EXCHANGE_NAME, "course", null, message.getBytes("UTF-8"));
            System.out.println("消息發(fā)送成功!");
        } catch (Exception ex) {
            // 捕獲異常并打印堆棧信息
            ex.printStackTrace();
            System.out.println("消息發(fā)送出現(xiàn)異常...");
        } finally {
            // 在try-with-resources中,不再需要顯式關(guān)閉連接和通道
            // 會自動關(guān)閉連接和通道
        }
    }
}

功能點:

  • 聲明了一個Direct類型的交換機,并綁定了三個隊列(queue5,queue6queue7)。其中queue5queue6都綁定到order路由鍵,而queue7綁定到course路由鍵。
  • 發(fā)送了一條消息到course路由鍵綁定的隊列中(即queue7)。

Consumer消費者代碼

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class RabbitMQConsumer {
    private final static String QUEUE_NAME = "queue7"; // 與生產(chǎn)者的綁定一致
    private final static String EXCHANGE_NAME = "direct_message_exchange";
    private final static String EXCHANGE_TYPE = "direct";
    public static void main(String[] args) {
        // 1. 創(chuàng)建連接工廠,設(shè)置連接參數(shù)
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("localhost");
        connectionFactory.setPort(5672); // RabbitMQ默認(rèn)端口
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        try (Connection connection = connectionFactory.newConnection();
             Channel channel = connection.createChannel()) {
            // 2. 聲明交換機和隊列,與生產(chǎn)者保持一致
            channel.exchangeDeclare(EXCHANGE_NAME, EXCHANGE_TYPE, true);
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);
            // 3. 綁定隊列到交換機,路由鍵為"course"
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "course");
            System.out.println(" [*] 等待接收消息...");
            // 4. 定義接收消息的回調(diào)函數(shù)
            DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println(" [x] 接收到的消息: '" + message + "'");
                // 這里可以添加進(jìn)一步的消息處理邏輯
            };
            // 5. 開始消費消息 (自動應(yīng)答)
            channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
        } catch (Exception ex) {
            // 捕獲異常并打印堆棧信息
            ex.printStackTrace();
            System.out.println("消費者運行中出現(xiàn)異常...");
        }
    }
}

功能點: 

   1.  與生產(chǎn)者保持一致:消費者的隊列名稱、交換機名稱和路由鍵與生產(chǎn)者保持一致,即監(jiān)聽queue7隊列,并接收路由鍵為course的消息。

   2. 回調(diào)函數(shù)處理消息:使用DeliverCallback來定義收到消息后的處理邏輯。在回調(diào)函數(shù)中,delivery.getBody()獲取消息內(nèi)容,隨后可以對消息進(jìn)行處理、存儲或其他業(yè)務(wù)邏輯操作。

   3 自動應(yīng)答basicConsume中的true表示自動應(yīng)答(auto-acknowledge),即消息處理完畢后,RabbitMQ會自動確認(rèn)消息已成功處理。如果需要手動應(yīng)答,可以將true替換為false,并在處理完成后調(diào)用channel.basicAck()來手動確認(rèn)消息。

到此這篇關(guān)于RabbitMQ的Direct Exchange模式實現(xiàn)的消息發(fā)布案例的文章就介紹到這了,更多相關(guān)RabbitMQ Direct Exchange消息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springCloud集成nacos config的過程

    springCloud集成nacos config的過程

    本文介紹spring cloud集成nacos config的過程,通過實例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Java解決LocalDateTime傳輸前端為時間的數(shù)組

    Java解決LocalDateTime傳輸前端為時間的數(shù)組

    本文主要介紹了Java解決LocalDateTime傳輸前端為時間的數(shù)組,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Logger.getLogger()與LogFactory.getLog()的區(qū)別詳解

    Logger.getLogger()與LogFactory.getLog()的區(qū)別詳解

    LogFactory來自common-logging包。如果用LogFactory.getLog,你可以用任何實現(xiàn)了通用日志接口的日志記錄器替換log4j,而程序不受影響
    2013-09-09
  • 用SpringBoot Admin監(jiān)控SpringBoot程序

    用SpringBoot Admin監(jiān)控SpringBoot程序

    這篇文章主要介紹了用SpringBoot Admin監(jiān)控SpringBoot程序,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • JAVA對稱加密算法PBE定義與用法實例分析

    JAVA對稱加密算法PBE定義與用法實例分析

    這篇文章主要介紹了JAVA對稱加密算法PBE定義與用法,結(jié)合實例形式分析了JAVA對稱加密算法PBE的概念、原理、定義及使用方法,需要的朋友可以參考下
    2019-09-09
  • Spring?Boot?多數(shù)據(jù)源處理事務(wù)的思路詳解

    Spring?Boot?多數(shù)據(jù)源處理事務(wù)的思路詳解

    這篇文章主要介紹了Spring?Boot?多數(shù)據(jù)源如何處理事務(wù),本文單純就是技術(shù)探討,要從實際應(yīng)用中來說的話,我并不建議這樣去玩分布式事務(wù)、也不建議這樣去玩多數(shù)據(jù)源,畢竟分布式事務(wù)主要還是用在微服務(wù)場景下,對Spring?Boot?多數(shù)據(jù)源事務(wù)相關(guān)知識感興趣的朋友參考下本文
    2022-06-06
  • 深入解析Java編程中的StringBuffer與StringBuider

    深入解析Java編程中的StringBuffer與StringBuider

    這篇文章主要介紹了Java編程中的StringBuffer與StringBuider,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • java中使用@Transactional會有哪些坑

    java中使用@Transactional會有哪些坑

    在Java中,@Transactional是一個常用的注解,用于聲明方法應(yīng)該在一個事務(wù)的上下文中執(zhí)行,本文主要介紹了java中使用@Transactional會有哪些坑,感興趣的可以了解一下
    2024-04-04
  • Netty解決 TCP 粘包拆包的方法

    Netty解決 TCP 粘包拆包的方法

    處理粘包的唯一方法就是制定應(yīng)用層的數(shù)據(jù)通訊協(xié)議,通過協(xié)議來規(guī)范現(xiàn)有接收的數(shù)據(jù)是否滿足消息數(shù)據(jù)的需要,本文給大家介紹Netty解決 TCP 粘包拆包的方法,需要的朋友一起看看吧
    2021-07-07
  • IDEA提示:Boolean method ‘xxx‘ is always inverted問題

    IDEA提示:Boolean method ‘xxx‘ is always&nb

    這篇文章主要介紹了IDEA提示:Boolean method ‘xxx‘ is always inverted問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論