RabbitMQ消息模型之Direct消息模型

news2024/11/15 2:10:10

Direct消息模型

* 路由模型:
*    一个交换机可以绑定多个队列
*    生产者给交换机发送消息时,需要指定消息的路由键
*    消费者绑定队列到交换机时,需要指定所需要消费的信息的路由键
*    交换机会根据消息的路由键将消息转发到对应的队列

*    缺点:
*      当消息很多的时候,需要指定的路由键也会很多,究极复杂。
生产者
package com.example.demo02.mq.direct;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;

/**
 * @author Allen
 * 4/11/2024 9:30 AM
 * @version 1.0
 * @description: 路由模型发送者
 *
 * 路由模型:
 *    一个交换机可以绑定多个队列
 *    生产者给交换机发送消息时,需要指定消息的路由键
 *    消费者绑定队列到交换机时,需要指定所需要消费的信息的路由键
 *    交换机会根据消息的路由键将消息转发到对应的队列

 *    缺点:
 *      当消息很多的时候,需要指定的路由键也会很多,究极复杂。
 */
public class DirectSender {
    public static void main(String[] args) throws Exception {
        // 1:创建连接
        Connection connection = ConnectionUtils.getConnection();
        // 2:创建通道
        Channel channel = connection.createChannel();
        // 3:声明交换机   参数1:交换机名称 参数2:交换机类型 参数3:是否持久化
        channel.exchangeDeclare("direct.exchange", BuiltinExchangeType.DIRECT, false);

        // 6:发送消息
        String msg1 = "{To DirectReceiver1: orderId:1001}";
        String msg2 = "{To DirectReceiver2: orderId:1002}";
        // 参数1:交换机 参数2:路由键(与消费者相匹配) 参数3:其他参数 参数4:消息内容
        channel.basicPublish("direct.exchange","order.save",null,msg1.getBytes());
        channel.basicPublish("direct.exchange","order.update",null,msg2.getBytes());
        // 7:关闭通道
        channel.close();
        // 8:关闭连接
        connection.close();
    }
}
消费者1
package com.example.demo02.mq.direct;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @author Allen
 * 4/11/2024 9:44 AM
 * @version 1.0
 * @description: 路由模型接收者1
 */
public class DirectReceiver1 {
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtils.getConnection();

        Channel channel = connection.createChannel();

        channel.exchangeDeclare("direct.exchange", BuiltinExchangeType.DIRECT, false);

        channel.queueDeclare("direct.queue1", false, false, false, null);

        channel.queueBind("direct.queue1","direct.exchange","order.save");

        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

                System.out.println("DirectReceiver1接收到的新增订单消息是:" + new String(body));
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        channel.basicConsume("direct.queue1",false,consumer);
    }
}
消费者2
package com.example.demo02.mq.direct;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @author Allen
 * 4/11/2024 9:44 AM
 * @version 1.0
 * @description: 路由模型接收者2
 */
public class DirectReceiver2 {
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtils.getConnection();

        Channel channel = connection.createChannel();

        channel.exchangeDeclare("direct.exchange", BuiltinExchangeType.DIRECT, false);

        channel.queueDeclare("direct.queue2", false, false, false, null);

        channel.queueBind("direct.queue2","direct.exchange","order.update");

        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

                System.out.println("DirectReceiver2接收到的修改订单消息:" + new String(body));
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        channel.basicConsume("direct.queue2",false,consumer);
    }
}
结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1596998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++vector类(个人笔记)

vector类 1.熟悉vector接口以及使用1.1vector的定义1.2vector迭代器使用1.3vector空间增长1.4vector增删查改1.5vector迭代器失效问题(重点) 2.vector的一些笔试题3.模拟实现vector 1.熟悉vector接口以及使用 vector的C官网文档 1.1vector的定义 (con…

基于Python的卷积网络的车牌识别系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

深入剖析Tomcat(二) 实现一个简单的Servlet容器

现在开始《深入剖析Tomcat》第二章的内容,第一章中,我们编码实现了一个能正常接收HTTP请求并返回静态资源的Web容器,这一章开始引入Servlet的概念,使我们的服务能根据请求动态返回内容。 Servlet是什么? 这是首先要弄…

FFmpeg: 自实现ijkplayer播放器--04消息队列设计

文章目录 播放器状态转换图播放器状态对应的消息: 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列,用于发送,设置播放…

docker-compose yaml指定具体容器网桥ip网段subnet;docker创建即指定subnet;docker取消自启动

1、docker-compose yaml指定具体容器网桥ip网段subnet docker-compose 启动yaml有时可能的容器网段与宿主机的ip冲突导致宿主机上不了网,这时候可以更改yaml指定subnet 宿主机内网一般是192**,这时候容器可以指定172* version: 3.9 services:coredns:…

内网渗透-域环境的搭建

域环境的搭建 文章目录 域环境的搭建前言一、什么是域环境 什么是域内网基础知识点 二、域环境的搭建 1. 部署域结构2.如何加入域3.SRV出错及解决办法4.SRV记录注册不成功的可能原因 禁用域中的账户将计算机退出域添加域用户总结 前言 一、什么是域环境 什么是域 域是一种管…

盘点2024年最新可用免费云服务器

随着云计算技术的快速发展,越来越多的企业和个人开始使用云服务器来满足各种业务需求。云服务器作为云计算的核心服务之一,以其弹性扩展、按需付费等特点受到广泛关注。本文将为大家盘点2024年最新可用免费云服务器,助力大家轻松上云&#xf…

浏览器工作原理与实践--CSRF攻击:陌生链接不要随便点

在上一篇文章中我们讲到了XSS攻击,XSS 的攻击方式是黑客往用户的页面中注入恶意脚本,然后再通过恶意脚本将用户页面的数据上传到黑客的服务器上,最后黑客再利用这些数据进行一些恶意操作。XSS攻击能够带来很大的破坏性,不过另外一…

量子飞跃:从根本上改变复杂问题的解决方式

内容来源:量子前哨(ID:Qforepost) 编辑丨王珩 编译/排版丨沛贤 深度好文:1000字丨5分钟阅读 利用多功能量子比特的量子计算机已处于解决复杂优化问题的最前沿,例如旅行商问题,这是一个典型的…

Python实现时间序列ARIMA模型(附带超详细理论知识和完整代码实现)

文章目录 0 结果1 介绍2 建模2.1 预备知识2.1.1 ADF检验结果(单位根检验统计量)2.1.2 差分序列的白噪声检验(这里使用Ljung-Box检验)2.1.3 ARIMA模型(差分整合移动平均自回归模型)的三个参数:p,…

探索分布式技术--------------注册中心zookeeper

目录 一、ZooKeeper是什么 二、ZooKeeper的工作机制 三、ZooKeeper特点 四、ZooKeeper数据结构 五、ZooKeeper应用场景 5.1统一命名服务 5.2统一配置管理 5.3统一集群管理 5.4服务器动态上下线 5.5软负载均衡 六、ZooKeeper的选举机制 6.1第一次启动选举机制 6.2非…

家居网购项目(Ajax验证用户名+上传图片)

文章目录 1.Ajax验证用户名1.程序框架图2.修改MemberServlet3.修改login.jsp4.结果展示 2.Ajax判断验证码是否输入正确1.修改MemberServlet2.修改login.jsp3.结果展示 3.Ajax添加购物车1.程序框架图2.修改CartServlet2.修改index.jsp3.解决问题—未登录直接添加购物车&#xff…

Excel文件解析

在此模块的学习中,我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是:解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析,将文件直接加载到内存,所以速度比较快,适合Excel文件数据量不…

没有算法大佬,都是草台班子

没有算法大佬,都是草台班子。 最近除了工作之外,还有一些时间在和加我微信的小伙伴沟通,聊的内容大部分集中在如何快速有效的学习人工智能、入门人工智能的技巧。 其中,一个知乎过来加我微信的小伙伴的经历更是让我感触很深。 …

eclipse导入maven项目与配置使用本地仓库

前言 本人润国外了,发现不能用收费软件IDEA了,需要使用eclipse,这个免费。 但是早忘了怎么用了,在此总结下。 一、eclipse导入本地项目 1.选这个:open projects from file system… 2.找到项目文件夹,…

树莓派点亮双色LED

双色LED灯准确来说叫双基色LED灯,是指模块只能显示2种颜色,一般是红色和绿色,可以有三种状态 :灭,颜色1亮,颜色2亮,根据颜色组合的不同,分为红蓝双色,黄蓝双色,红绿双色等等。 接线:将引脚S(绿色)和中间引脚(红色)连接到Raspberry Pi的GPIO接口上,对Raspberry…

《QT实用小工具·二十六》运行时间记录

1、概述 源码放在文章末尾 运行时间记录,包含如下功能: 可以启动和停止服务,在需要的时候启动。 可以指定日志文件存放目录。 可以指定时间日志输出间隔。 可以单独追加一条记录到日志文件。 日志为文本格式,清晰明了。 软…

JavaScript排序大揭秘:手绘图解6大常见排序算法,一网打尽

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 本文用图解总结梳理了6种常见的排序算法 ,如下👇&#xff1…

【热门话题】PyTorch:深度学习领域的强大工具

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 PyTorch:深度学习领域的强大工具一、PyTorch概述二、PyTorch核心特性…

WGCNA分析

目录 基本概念 基本原理 下游分析 基本概念 WGCNA其译为加权基因共表达网络分析。该分析方法旨在寻找协同表达的基因模块(module),并探索基因网络与关注的表型之间的关联关系,以及网络中的核心基因。 适用于复杂的数据模式(推荐5组(或者…