IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 2-RabbitMQ实现Direct模式 -> 正文阅读

[大数据]2-RabbitMQ实现Direct模式

1. Fanout模式和Direct模式对比

? Fanout模式是由Fanout交换机向所有绑定的队列发送消息, 而Direct模式是向指定目标的队列进行消息发送, 前者是广播, 后者是匹配推送.

参考>>

fanout:

在这里插入图片描述

direct:

在这里插入图片描述

2. 编码实现Direct模式

工程延续上一章>>

2.1 在生产者中定义交换机和队列并进行绑定

/**
 * @ClassName: RabbitMQConfiguration
 * @Author zhangjin
 * @Date 2021/8/15 21:24
 * @Description: Direct模式, 完成交换机的创建, 队列的创建以及绑定
 * 就是将FanoutExchange改成了DirectExchange并在绑定时添加.with()条件和routingKey匹配即可
 */
@Configuration
public class RabbitMQConfiguration {

    /**
     * Direct模式的交换机名
     */
    public static final String exchangeName = "login_direct_exchange";

    /**
     * Direct模式的交换机, 持久化, 非自动删除的交换机
     * @return DirectExchange
     */
    @Bean
    public DirectExchange fanoutExchange() {
        return new DirectExchange(exchangeName,true,false);
    }

    /**
     * 创建短信队列 sms.direct.queue
     */
    @Bean
    public Queue smsQueue() {
        return new Queue("sms.direct.queue");
    }
    /**
     * 创建邮件队列 mail.direct.queue
     */
    @Bean
    public Queue mailQueue() {
        return new Queue("mail.direct.queue");
    }

    /**
     * 将交换机和队列进行绑定
     * Direct模式多出一个.with()条件, 用于和路由key中的字符串进行匹配
     * 完成向指定队列发送信息
     */
    @Bean
    public Binding smsBinding() {
        return BindingBuilder.bind(smsQueue()).to(fanoutExchange()).
                with("sms");
    }

    @Bean
    public Binding mailBinding() {
        return BindingBuilder.bind(mailQueue()).to(fanoutExchange()).
                with("mail");
    }

}

2.2 登录逻辑案例–消息的生产

@Service
public class LoginService {

    @Resource
    private RabbitTemplate rabbitTemplate;

    public void register(String phone, String userInfo) {
        // 1. 将用户信息入库, 完成注册
        System.out.println(phone + " 用户已入库 " + userInfo);

        // 2. 将用户信息发送给指定交换机 sms; direct模式需要指定routingKey
        // 只发送消息到sms队列
        String routingKey = "mail"; // sms or mail
        rabbitTemplate.convertAndSend(RabbitMQConfiguration.exchangeName, routingKey, userInfo);

        // 也可以分别发
        String routingKey2 = "sms"; // sms or mail
        rabbitTemplate.convertAndSend(RabbitMQConfiguration.exchangeName, routingKey2, userInfo);
    }
}

测试代码:

@SpringBootTest
class ProducerServerApplicationTests {

    @Resource
    private LoginService loginService;

    @Test
    void contextLoads() {
        loginService.register("119", "这是用户信息");
    }

}

执行测试用例模拟用户注册并将消息投递到相应的队列中

在这里插入图片描述

2.3 在消费者中编写短信服务和邮件服务完成队列中消息的消费

短信服务

@Service
@RabbitListener(queues = {"sms.direct.queue"})
public class SMSService {

    @RabbitHandler
    public void sandSMS(String message) {
        System.out.println("向 "+message+" 发送了短信");
    }
}

邮件服务

@Service
@RabbitListener(queues = {"mail.direct.queue"})
public class MailService {
    @RabbitHandler
    public void sandMail(String message) {
        System.out.println("向 "+message+" 发送了邮件");
    }
}

启动消费者工程, 查看队列中的消息被消费

在这里插入图片描述

3. 完整项目代码

码云仓库>>

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:48:52  更:2021-08-16 11:49:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 8:43:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码