RabbitMQ速通--02工作模式

RabbitMQ 的工作模式 在这里,我们并不重点关注。 阅读详情

RabbitMQ的工作模式

在发送或者接收消息后我们可以在RabbitMQ的控制面板中去查看其发生的变化

对于RabbitMQ的不同工作模式,其本质上是基于不同类型的交换机(Exchange)和不同的绑定(Binding)规则来实现的

以下所有示例都需要导入此依赖,这些示例是使用了原生API,可以更好的帮助我们理解RabbitMQ的工作模式,在实际开发中仍然会使用Spring系列的框架对其进行整合.
我只在第一个示例中给出较为详细的代码,后续工作模式示例只给出核心代码

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
 </dependency>

简单模式

使用的交换机:默认交换机(“”,Direct 类型)

特点:
生产者直接发送消息到队列(实际上是发送到默认交换机,路由键 routing_key 设为队列名)

消费者直接从队列消费

/**
 * 简单模式 - 生产者
 * 特点:一个生产者发送消息到一个队列,一个消费者从该队列接收消息
 */
public class SimpleProducer {
    // 定义队列名称
    private final static String QUEUE_NAME = "hello";
    
    public static void main(String[] args) throws Exception {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 设置RabbitMQ服务器地址
        factory.setHost("localhost");
        // 设置RabbitMQ服务器端口号
        factory.setPort(5672);
        // 设置虚拟主机地址
        factory.setVirtualHost("/");
        // 设置RabbitMQ服务器用户名和密码
        factory.setUsername("guest");
        factory.setPassword("guest");
        
        // try-with-resources确保资源自动关闭
        try (Connection connection = factory.newConnection(); // 创建连接
             Channel channel = connection.createChannel()) {  // 创建通道
            
            // 声明队列,参数说明:
            // 1. 队列名称
            // 2. 是否持久化(false表示不持久化)
            // 3. 是否独占队列(false表示不独占)
            // 4. 是否自动删除(false表示不自动删除)
            // 5. 其他参数(null表示无其他参数)
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            
            // 准备发送的消息
            String message = "Hello World!";
            
            // 发布消息,参数说明:
            // 1. 交换机名称(""表示默认交换机)
            // 2. 路由键(这里是队列名称)
            // 3. 消息属性(null表示无特殊属性)
            // 4. 消息体(字节数组)
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

/**
 * 简单模式 - 消费者
 */
public class SimpleConsumer {
    private final static String QUEUE_NAME = "hello";
    
    public static void main(String[] args) throws Exception {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 设置RabbitMQ服务器地址
        factory.setHost("localhost");
        // 设置RabbitMQ服务器端口号
        factory.setPort(5672);
        // 设置虚拟主机地址
        factory.setVirtualHost("/");
        // 设置RabbitMQ服务器用户名和密码
        factory.setUsername("guest");
        factory.setPassword("guest");
        
        // 创建连接和通道
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        
        // 声明队列(必须与生产者声明的队列一致)
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages...");
        
        // 定义消息接收回调
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            // 将消息体转换为字符串
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + message + "'");
        };
        
        // 开始消费消息,参数说明:
        // 1. 队列名称
        // 2. 是否自动确认(true表示自动确认)
        // 3. 消息接收回调
        // 4. 消费者取消回调(这里为空实现)
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
    }
}

工作队列模式

使用的交换机:默认交换机(“”,Direct 类型)

特点:
多个消费者共享同一个队列,RabbitMQ 以轮询(Round-Robin)方式分发消息

适合任务分发场景


// 生产者
channel.queueDeclare("task_queue", true, false, false, null); // 持久化队列

String message = "New task...";
channel.basicPublish("", "task_queue", 
    MessageProperties.PERSISTENT_TEXT_PLAIN, // 持久化消息
    message.getBytes());

// 消费者(Worker)
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
    String message = new String(delivery.getBody(), "UTF-8");
    System.out.println(" [x] Received '" + message + "'");
    // 模拟工作耗时
    try { Thread.sleep(1000); } catch (InterruptedException e) {}
    System.out.println(" [x] Done");
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
channel.basicConsume("task_queue", false, deliverCallback, consumerTag -> {});

发布/订阅模式

使用的交换机:Fanout 交换机(扇出交换机)

特点:
生产者发送的消息会被广播到所有绑定的队列

每个消费者都有自己的独立队列

// 生产者
channel.exchangeDeclare("logs", "fanout"); // 声明fanout交换机

String message = "Broadcast message!";
channel.basicPublish("logs", "", null, message.getBytes()); // 路由键为空

// 消费者(每个消费者有自己的临时队列)
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, "logs", ""); // 绑定到fanout交换机

路由模式

使用的交换机:Direct 交换机

特点:
生产者指定 routing_key,交换机根据 routing_key 将消息路由到匹配的队列

适用于精确匹配的消息分发(如 error、info 日志分类)

// 生产者
channel.exchangeDeclare("direct_logs", "direct"); // 声明direct交换机

String severity = "error"; // 路由键
String message = "Error log!";
channel.basicPublish("direct_logs", severity, null, message.getBytes());

// 消费者(只接收error级别的日志)
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, "direct_logs", "error"); // 绑定指定路由键

主题模式

使用的交换机:Topic 交换机

特点:
支持通配符匹配 *(单个单词)和 #(多个单词)

适用于更灵活的路由规则(如 logs.error.*、orders.#)

// 生产者
channel.exchangeDeclare("topic_logs", "topic"); // 声明topic交换机

String routingKey = "logs.error";
String message = "Topic message!";
channel.basicPublish("topic_logs", routingKey, null, message.getBytes());

// 消费者(使用通配符绑定)
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, "topic_logs", "logs.*"); // 匹配logs.开头的路由键

RPC模式

使用的交换机:默认交换机(Direct)或自定义交换机

特点
客户端发送请求消息
服务端处理请求并返回响应
使用回调队列和关联ID

// 客户端(发送RPC请求)
String callbackQueue = channel.queueDeclare().getQueue(); // 回调队列
AMQP.BasicProperties props = new AMQP.BasicProperties
    .Builder()
    .correlationId(UUID.randomUUID().toString())
    .replyTo(callbackQueue)
    .build();

channel.basicPublish("", "rpc_queue", props, "RPC request".getBytes());

// 服务端(处理RPC请求)
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
    AMQP.BasicProperties replyProps = new AMQP.BasicProperties
        .Builder()
        .correlationId(delivery.getProperties().getCorrelationId())
        .build();
    
    String response = processRpcRequest(new String(delivery.getBody(), "UTF-8"));
    channel.basicPublish("", delivery.getProperties().getReplyTo(), replyProps, response.getBytes());
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
channel.basicConsume("rpc_queue", false, deliverCallback, consumerTag -> {});
RabbitMQ七种工作模式 概念 RabbitMQ的一个消息代理:它接受并转发消息。 你可以把它当成一个邮局:当你想邮寄信件的时候,你会把信件放在投递箱中,并确信邮递员最终会将信件送到收件人的手里。在这个例子中,RabbitMQ就相当于投递箱、邮局和邮递员。 AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到对队列中,只是将消息发送到一个交... 阅读详情

相关推荐

RabbitMQ工作模式详解,以及Java实现

RabbitMQ共有六种工作模式:简单模式(Simple)、工作队列模式(Work Queue)、发布订阅模式(Publish/Subscribe)、路由模式(Routing)、通配符模式(Topics)、远程调用模式(RPC,不常用,不做讲解说明)

qq_69331283的博客 2068

RabbitMQ五种工作模式

RabbitMQ五种工作模式 1、简单队列 一个生产者对应一个消费者!! 2、work 模式 一个生产者对应多个消费者,但是一条消息只能有一个消费者获得消息!!! 轮询分发就是将消息队列中的消息,依次发送给所有消费者。一个消息只能被一个消费者获取。 3、发布/订阅模式 一个消费者将消息首先发送到交换器,交换器绑定到多个队列,然后被监听该队列的消费者所接收并消费。 ps:X表示交换器,在RabbitMQ中,交换器主要有四种类型:direct、fanout、topic、headers,这里的交换器是 fa

weixin_41882200的博客 1万+

Oracle MCP Server实战:自然语言如何重塑数据库交互体验

本文深入探讨了Oracle MCP Server如何通过自然语言交互技术革新数据库操作体验。作为Oracle数据库的革命性工具,MCP Server集成了先进的Text-to-SQL技术,允许用户使用自然语言直接查询数据库,大幅降低使用门槛。文章详细介绍了从环境搭建、实战案例到企业级部署的全流程,特别强调了中文自然语言处理能力和安全最佳实践,为DBA和开发者提供了从传统SQL到智能交互的转型指南。

u9v0w的博客 282

RabbitMQ的六种工作模式以及代码实现

一、什么是RabbitMQ rabbitmq是基于amqp协议实现一套高效的数据传输组件,MQ(消息队列)。 常见的MQ:ActiveMQ、Kafka、RocketMQ、RabbitMQ 官方文档:https://www.rabbitmq.com/getstarted.html 二、MQ的应用场景 1、消息异步通知(注册时邮箱认证、添加商品生成详情页和将商品添加到搜索库等) 2、消息顺序处理 3、消息延迟处理 4、请求削峰 三、六种工作模式 1.1 simple简单模式 1)消息产生后将消息放入队列 2)

sinJack的博客 3万+

DeepSeek 在 PostgreSQL 中,执行 `DELETE` 操作后,数据占用的空间并不会立即释放给操作系统

操作后,数据占用的空间并不会立即释放给操作系统。这是 PostgreSQL 的 MVCC(多版本并发控制)机制决定的——删除的数据只是被标记为“死元组”,物理空间仍然被表占用。这是最彻底的释放方式,会将表重写为一个没有空洞的新文件,将空间返回给操作系统。如果你的表非常大(如几百GB),或者这是生产环境的核心表,建议优先考虑。你可以告诉我你的表大概多大、是否能接受锁表,我可以给你更精确的建议。要真正释放空间,需要根据你的实际需求,从以下三种方案中选择一种。如果你既想彻底释放空间,又无法接受锁表,

m0_37843156的博客 403

手把手配置:用Synopsys VDK为英飞凌TC4x系列MCU做虚拟原型开发

本文详细介绍了如何使用Synopsys VDK为英飞凌TC4x系列MCU进行虚拟原型开发,涵盖开发环境搭建、关键外设虚拟化配置、AUTOSAR栈集成及虚拟调试与性能调优全流程。通过虚拟原型技术,开发者可提前6-12个月启动软件开发,显著提升汽车电子项目的开发效率。

weixin_30606461的博客 290

二十分钟带你速通RabbitMQ

RabbitMQ 是基于 AMQP(高级消息队列协议)的开源消息代理和队列服务器。在分布式系统里,它负责在不同组件间传递消息,实现系统解耦、异步处理与流量削峰。

Bbb36921的博客 2317

SAP PS项目结算实操:从CJ20N到CJ88,手把手搞定项目成本结转与凭证生成

本文详细解析SAP PS项目结算全流程,从CJ20N到CJ88的操作要点,涵盖成本归集、结算规则配置、结果分析及凭证生成等关键环节。特别针对FICO模块中的项目凭证流转问题提供实战解决方案,帮助财务人员规避常见配置错误,提升项目结算效率与准确性。

weixin_26833503的博客 813

RabbitMQ的6种工作模式详解

目录RabbitMQ几种工作模式1.Work queues代码实例1.生产者1.application.yml2.RabbitMqConfig3.TestSend2.消费者1.配置相同,config相同2.RabbitMqListen监听获取消息3.运行1.Publish发布订阅模式代码实例1.生产者1.RabbitMqConfig3.TestSend2.消费者1.配置相同,config相同2.RabbitMqListen监听获取消息3.运行3.Routing路由模式代码实例1.生产者1.RabbitMqC

逆天的博客 1万+

Android 11多窗口+分屏+APP窗口嵌套TaskView实现原理一

然而随着版本的迭代升级,google对分屏的定制差异化也越来越大,Androd 11的分屏用的是split-screen-primary和split-screen-secondary的方式,在systemui中去实现的,其定制化的灵活度不是很高,很多业务都是放到sustemui或者fw去实现,但是随着版本的升高,后面出现了TaskView来替代了老版本的分屏方式,但是Task的核心原理其实和之前的方式是一样的,TaskView来实现分屏。

qq_18420641的博客 2613

YOLO11 Backbone改进:二值化、三值化权重实战(一)

本文介绍了二值化/三值化神经网络的基本概念、优势挑战及应用场景。二值化网络将权重限制为±1,三值化则增加0值,显著减少模型存储需求和计算复杂度。虽然存在精度下降等挑战,但通过技术改进已能在移动设备、自动驾驶等领域应用。文章分析了YOLO11中适合量化的层,并详细阐述了二值化权重原理及Straight-Through Estimator等关键技术。二值化/三值化神经网络为资源受限设备提供了高效的深度学习解决方案。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 298

【RabbitMQ】工作模式

对RabbitMQ工作模式的简单概述以及代码案例

weixin_73060900的博客 1753

1、语义数据建模:避免陷阱与突破困境

本文探讨了语义数据建模的兴起背景、核心概念、生命周期及常见挑战。从数据丰富型组织和AI开发者的需求出发,分析了语义建模的关键元素和质量维度,并深入讨论了建模过程中可能出现的陷阱与解决方案。文章还针对语义模型的演化、治理和战略组织问题提供了突破思路,旨在帮助数据从业者更好地理解和应用语义建模技术,以提升数据驱动应用的有效性。

c8d9e0f1的博客 119

【RabbitMQ】 RabbitMQ 工作模式

RabbitMQ工作模式

2403_87459748的博客 1705

【微信小程序】微信小程序开发环境搭建:安装微信小程序开发者工具

通过本文的介绍,你应该已经成功安装并配置了微信小程序开发者工具,为微信小程序开发做好了准备。接下来,你可以开始编写你的第一个小程序项目,探索更多有趣的功能和特性。祝你开发顺利,创造更多优秀的作品!

墨夶的博客 2946

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RabbitMQ基础-工作模式

RabbitMQ

世界万般阻碍,我们见字如面! 2123

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

面试官:RabbitMQ有哪些工作模式?

RabbitMQ有哪些工作模式?

真正的大师永远怀着一颗学徒的心 4260

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

RabbitMQ五种工作模式学习总结

一、简介 最近,在看一些消息中间件的内容,之前都没有好好学习一下消息中间件。本文将对RabbitMQ中五种常用的工作模式做一个简单的介绍和总结。RabbitMQ常用的工作模式有:简单队列模式、工作队列模式、发布订阅模式、路由模式、主题模式。本文参照RabbitMQ官网示例总结,详细可以到官网查看:https://www.rabbitmq.com/getstarted.html。 二、简单队列模...

weixiaohuai的博客 3344

RabbitMQ 七种工作模式介绍

RabbitMQ 共提供了7种⼯作模式供我们进⾏消息传递,接下来一一介绍它的实现与目的

chaodddddd的博客 2979

MQ的快速入门及RabbitMQ的五种工作模式

Mq消息中间件的基础知识,rabbitmq的工作模式,springboot集成rabbitmq

weixin_64133130的博客 4113

RabbitMQ工作模式

P是生产者Producer,C是消费者Consumer。

sniper_fandc的博客 1741

信使之舞 之 RabbitMQ 7种工作模式概述

RabbitMQ 共提供了7种工作模式, 进行消息传递。

明志の博客 1890

RabbitMQ六种工作模式详解

RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。RabbitMQ官方地址:http://www.rabbitmq.com/RabbitMQ提供了6种模式:官网对应模式介绍:https://www.rabbitmq.com/getstarted.htmlAMQP 一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消

soberw的日常分享博客 4561

RabbitMQ消息队列速通

RabbitMQ的基本使用

2203_75546900的博客 1591
上一篇: RabbitMQ速通--01消息队列概述与安装
下一篇: RabbitMQ速通--03整合SpringBoot
sisyphoslee
博客等级 码龄7年 942粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值