RabbitMQ 路由模式(Routing)-使用 direct Exchange
任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1、处理路由键
2、需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。
3、一般情况可以使用rabbitMQ自带的Exchange:" "(该Exchange的名字为空字符串,下文称其为default Exchange)。
4、这种模式下不需要将Exchange进行任何绑定(binding)操作
5、消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
6、如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。
Channel channel = connection.createChannel(); channel.exchangeDeclare("exchangeName", "direct"); //direct fanout topic channel.queueDeclare("queueName"); channel.queueBind("queueName", "exchangeName", "routingKey"); byte[] messageBodyBytes = "hello world".getBytes(); //需要绑定路由键 channel.basicPublish("exchangeName", "routingKey", MessageProperties.PERSISTENT_TEXT_PLAIN, messageBodyBytes);
生产者
1、创建一个
direct模式的exchange(交换机)
channel.exchange_declare(exchange='direct_logs',type='direct')
2、向交换机中发送消息
channel.basic_publish(exchange='direct_logs',routing_key=severity,body=message)
private final static String EXCHANGE_NAME = "test_exchange_direct"; @Test public void testSend() throws Exception { // 获取到连接以及mq通道 Connection connection = ConnectionUtil.getConnection(); Channel channel = connection.createChannel(); // 声明exchange channel.exchangeDeclare(EXCHANGE_NAME, "direct"); // 消息内容 String message = "这是消息A"; channel.basicPublish(EXCHANGE_NAME, "A", null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); channel.close(); connection.close(); }
消息者
1、声明队列
channel.queueDeclare(QUEUE_NAME_1, false, false, false, null);
2、创建消息与交换机的绑定
channel.queue_bind(exchange=exchange_name,queue=queue_name)
channel.queue_bind(exchange=exchange_name,queue=queue_name, routing_key='black')
3、生产者发出消息后,匹配的路由key会接收到消息
消费者1
private final static String QUEUE_NAME_1 = "test_queue_direct_1"; @Test public void testRecv1() throws Exception { // 获取到连接以及mq通道 Connection connection = ConnectionUtil.getConnection(); Channel channel = connection.createChannel(); // 声明队列 channel.queueDeclare(QUEUE_NAME_1, false, false, false, null); // 绑定队列到交换机 channel.queueBind(QUEUE_NAME_1, EXCHANGE_NAME, "A"); // 同一时刻服务器只会发一条消息给消费者 channel.basicQos(1); // 定义队列的消费者 QueueingConsumer consumer = new QueueingConsumer(channel); // 监听队列,手动返回完成 channel.basicConsume(QUEUE_NAME_1, false, consumer); // 获取消息 while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String message = new String(delivery.getBody()); System.out.println(" [x] Received '" + message + "'"); Thread.sleep(10); channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); } }
消息者2
private final static String QUEUE_NAME_2 = "test_queue_direct_2"; @Test public void testRecv2() throws Exception { // 获取到连接以及mq通道 Connection connection = ConnectionUtil.getConnection(); Channel channel = connection.createChannel(); // 声明队列 channel.queueDeclare(QUEUE_NAME_2, false, false, false, null); // 绑定队列到交换机 channel.queueBind(QUEUE_NAME_2, EXCHANGE_NAME, "B"); channel.queueBind(QUEUE_NAME_2, EXCHANGE_NAME, "A"); // 同一时刻服务器只会发一条消息给消费者 channel.basicQos(1); // 定义队列的消费者 QueueingConsumer consumer = new QueueingConsumer(channel); // 监听队列,手动返回完成 channel.basicConsume(QUEUE_NAME_2, false, consumer); // 获取消息 while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String message = new String(delivery.getBody()); System.out.println(" [x] Received '" + message + "'"); Thread.sleep(10); channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); } }
书生整理于网络
2019-03-06 22:33
RabbitMQ进阶教程
RabbitMQ入门教程
- RabbitMQ 简介
- RabbitMQ 环境配置-基于linux
- RabbitMQ 环境配置-基于windows 10 x64
- RabbitMQ 插件管理
- RabbitMQ 用户管理
- RabbitMQ vhost管理
- RabbitMQ 简单队列
- RabbitMQ Work模式消息队列
- RabbitMQ 消息确认方式
- RabbitMQ 三种Exchange(fanout,direct,topic)模式
- RabbitMQ 发布订阅模式(Publish、Subscribe)
- RabbitMQ 路由模式(Routing)-使用 direct Exchange
- RabbitMQ topic Exchange使用
开源项目
知识点
相关教程
更多RabbitMQ 三种Exchange(fanout,direct,topic)模式
RabbitMQ提供了四种Exchange:fanout,direct,topic,header, header模式在实际使用中较少,本文只对前三种模式进行比较。 性能排序:fanout > direct >> topic。比例大约为11:10:6 1、Fanout Exchange 任何发送到Fanout Exchange的消息都会被转发到与该Exchang
RabbitMQ topic Exchange使用
任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上 1、这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列。 2、这种模式需要RouteKey,也许要提前绑定Exchange与Queue。 3、
RabbitMQ 简介
MQ全称为Message Queue,消息队列是应用程和应用程序之间的通信方法。 AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AMQP 客户端能够无视消息的来源任意发送和接受信息。AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件 (MOM)
RabbitMQ 与Spring整合
添加spring与rabbitmq整合的依赖 <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.6.0.RELEASE</version
RabbitMQ 发布订阅模式(Publish、Subscribe)
1、1个生产者,多个消费者 2、每一个消费者都有自己的一个队列 3、生产者没有将消息直接发送到队列,而是发送到了交换机 4、每个队列都要绑定到交换机 5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的 消息生产者 private final static String EXCHANGE_NAME = "test_exchan
龙天Direct培训系列教程
网盘下载龙天Direct培训系列教程 2012-10-05 19:47 50,508,186 COM编程基础9龙天资源首发-wWw.LtHack.Com.avi 2012-10-05 19:54 101,571,706 DX14基础知识补充龙天资源首发-wWw.LtHack.Com.avi 2012-10-05 19:55 45,004,570 DX15练习题龙天资源首发-wWw
RabbitMQ 插件管理
RabbitMQ 插件管理的脚本是rabbitmq-plugins.bat,linux平台是rabbitmq-plugins rabbitmq-plugins脚本的使用方法命令如下 Usage: rabbitmq-plugins [-n] [ ] Commands: list [-v]
RabbitMQ vhost管理
RabbitMQ vhost 全称为Virtual Host(虚拟主机),一个broker里可以开设多个vhost,用作不同用户的权限分离。权限控制组,用户只能关联到一个vhost上,一个vhost中可以有若干个Exchange和Queue,默认的vhost是"/" 一、通过RabbitMQ管理后台管理vhost http://localhost:15672/#/vhosts
RabbitMQ 环境配置-基于windows 10 x64
RabbitMQ 消息确认方式
消费者从队列中获取消息,服务端如何知道消息已经被消费呢? 模式1:自动确认 只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。 模式2:手动确认 消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。 通过channel获取消费者的时候,第二个参
RabbitMQ Work模式消息队列
一个生产者、多个消费者。 一个消息只能被一个消费者获取。 生产者发布消息 private final static String QUEUE_NAME = "test_queue_work";@Testpublic void testSend() throws Exception { // 获取到连接以及mq通道 Connection connecti
RabbitMQ 集群搭建
准备机器: 192.168.56.101 huangyineng 192.168.56.102 slave2 192.168.56.103 slave1 参考《RabbitMQ 环境配置-基于linux》安装好三台RabbitMQ server,然后开启 RabbitMQ 监控插件 [hadoop@huangyineng rabbitmq]$ sbin/rabbi
RabbitMQ 环境配置-基于linux
由于 RabbitMQ 是使用erlang开发的,所以首先要安装erlang http://www.erlang.org/downloads http://erlang.org/download/otp_src_19.0.tar.gz [ hadoop@huangyineng dn1]$ tar -zxvf otp_src_19.0.tar.gz
RabbitMQ 简单队列
生产者将消息发送到队列,消费者从队列中获取消息。 P:消息的生产者 C:消息的消费者 红色:队列 首先引用rabbitmq的客户端程序所依赖的jar包: <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</ar
RabbitMQ 用户管理
用户管理可以使用RabbitMQ 管理后台操作,也可以通过命令行操作 一、通用RabbitMQ 管理后台管理用户 http://localhost:15672/#/users 增加用户 查看当前用户列表 http://localhost:15672/#/users 更改用户信息、删除用户 二、使用命令行操作用户 和用户相关的命令有: add_user <username>
最新教程
更多java线程状态详解(6种)
java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞
redis从库只读设置-redis集群管理
默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave. 127.0.0.1:6382> set k3 111 (error) READONLY You can't write against a read only slave. 如果你要开启从库
Netty环境配置
netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。
Netty基于流的传输处理
在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据
Netty入门实例-使用POJO代替ByteBuf
使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。
Netty入门实例-时间服务器
Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现
Netty入门实例-编写服务器端程序
channelRead()处理程序方法实现如下
Netty开发环境配置
最新版本的Netty 4.x和JDK 1.6及更高版本
电商平台数据库设计
电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表
HttpClient 上传文件
我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。
MongoDB常用命令
查看当前使用的数据库 > db test 切换数据库 > use foobar switched to db foobar 插入文档 > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new
快速了解MongoDB【基本概念与体系结构】
什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
windows系统安装MongoDB
安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我
Spring boot整合MyBatis-Plus 之二:增删改查
基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baom
分布式ID生成器【snowflake雪花算法】
基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案