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 三种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实现方案