【RabbitMQ】RabbitMQ学习

1. 发送流程

  1. 生产者 - connection - channel - 交换机 - 对列- channel - connection - 消费者

2. 工作模式

2.1. 简单模式(点对点)

一个消费者一个生产者,直接进行通信。

2.2. 工作对列模式

    1. 多个消费者共同消费消息对列中的消息。
    2. 同一条消息只能被一个消费者消费。

2.3. 发布订阅模式

这个模式中,多了一个 exchange host 角色

    1. 可以将消息传给所有对列。
    2. 同一条消息所有的消费者都能消费。

2.3.1. 定向模式(Direct\Routing)

    1. 通过 Binding Key 对于交换机和对列进行绑定

2.3.2. 通配符模式(Topic)

    1. 是路由模式的升级。
    2. 可以使用通配符对于 Routing Key 进行模糊映射。
    3. *表示一个字符,#表示多个字符

2.3.3. 广播模式(Fanout)

2.4. 发布确认模式

    1. 服务器会在收到生产者发送的消息后,向生产者发送 ACK,表示自己收到消息了。
    2. 常用于安全性需求高的场景。

2.5. RPC模式

    1. 一个客户端一个服务端
    2. 通过两个对列进行

3. 交换机的类型

3.1. 广播(fanout)

是发布订阅模式。

一个交换机,将消息转发到于其绑定的所有对列,每个消费者都能享有这些消息。

3.2. 定向(dirct)

根据routing key ,会发送给 binding Key 符合的对列。

3.3. 通配符(topic)

将消息转发给 和带有通配符的 binding key 的对列。

3.4. headers类型

根据消息内容进行匹配,消息内容中有headers内容进行匹配,

发送消息的时候,使用的是 Routing Key

传到对列的时候,使用的是 Binding Key

4. 代码流程

  1. 创建连接
  2. 创建 Channel 通道
  3. 声明 Exchange host 交换机
  4. 声明 Queue 对列
  5. 发送消息
  6. 消费消息
  7. 释放资源

代码:

复制代码
package org.example.work;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.example.constant.Constants;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class ProducerDemo {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 初始化
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost(Constants.HOST);
        connectionFactory.setPort(Constants.PORT);
        connectionFactory.setUsername(Constants.USER_NAME);
        connectionFactory.setPassword(Constants.PASSWORD);
        connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST);

        // 2. 创建connection
        Connection connection = connectionFactory.newConnection();

        // 3. 创建channel
        Channel channel = connection.createChannel();

        // 4. 创建exchange host(如果需要的话)
        // TODO

        // 5. 声明queue
        channel.queueDeclare(Constants.WORK_QUEUE_NAME, true, false,false,null);

        // 6. 发送消息

        for (int i = 0; i < 10; i++) {
            String msg = "hello work mode..." + (i);
            channel.basicPublish("",Constants.WORK_QUEUE_NAME, null, msg.getBytes());
        }

        // 7. 释放资源
        channel.close();
        connection.close();
    }
}
相关推荐
想用offer打牌8 分钟前
一站式了解Spring AI Alibaba的流式输出
java·人工智能·后端
Lonely丶墨轩9 分钟前
从登录入口窥见架构:一个企业级双Token认证系统的深度拆解
java·数据库·sql
收获不止数据库25 分钟前
黄仁勋2026CES演讲复盘:旧世界,裂开了!
大数据·数据库·人工智能·职场和发展
汽车仪器仪表相关领域1 小时前
工况模拟精准检测,合规减排赋能行业 ——NHASM-1 型稳态工况法汽车排气检测系统项目实战经验分享
数据库·算法·单元测试·汽车·压力测试·可用性测试
2301_800256111 小时前
数据库设计中的 “数据依赖→设计异常→关系分解(范式)” 核心逻辑
数据库·postgresql
冰冰菜的扣jio1 小时前
Redis基础数据结构
数据结构·数据库·redis
汽车仪器仪表相关领域1 小时前
光轴精准测量,安全照明保障——NHD-8101/8000型远近光检测仪项目实战分享
数据库·人工智能·安全·压力测试·可用性测试
掘根1 小时前
【仿Muduo库项目】EventLoop模块
java·开发语言
大爱编程♡1 小时前
Spring IoC&DI
数据库·mysql·spring
信码由缰1 小时前
Java 中的 AI 与机器学习:TensorFlow、DJL 与企业级 AI
java