RabbitMQ入门-路由-有选择的接受消息
比如一个日志系统,之前的处理方式呢,是各种类型(info,error,warning)的消息都发给订阅者,可是实际情况上不一定都需要。可能A需要error,其他的都不需要。那么就引入了今天的处理方式--路由(直接交换)

(兔子的官网真心良心,图文并茂,通俗易懂)这种处理方式你只需记住一个字:有选择的接受消息
首先,我们将消息绑定在不同的路由键上,然后消费者根据需要绑定对应的路由键即可收到消息。路由键随便取名字
生产者代码:
package com.example.demo; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; import java.io.IOException;
import java.util.concurrent.TimeoutException; /**
* 有选择的接受消息
*/
public class RoutingSend { private static final String EXCHANGE_NAME = "logs"; public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory(); // 连接工厂
factory.setHost("localhost");
Connection connection = factory.newConnection(); // 获取连接
Channel channel = connection.createChannel(); // 当我们发送时,需要一个路由密钥,这里选择直接交换
channel.exchangeDeclare(EXCHANGE_NAME, "direct"); String[] msg = {"错误","信息","警告"};
// 第二个参数为路由密钥
channel.basicPublish(EXCHANGE_NAME, "error", null, msg[0].getBytes());
channel.basicPublish(EXCHANGE_NAME, "info", null, msg[1].getBytes());
channel.basicPublish(EXCHANGE_NAME, "warning", null, msg[2].getBytes());
System.out.println("PS-Send:" + msg.toString()); channel.close();
connection.close(); }
}
消费者代码:
package com.example.demo; import com.rabbitmq.client.*; import java.io.IOException;
import java.util.concurrent.TimeoutException; public class RoutingReceive { private static final String EXCHANGE_NAME = "logs"; public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory(); // 连接工厂
factory.setHost("localhost");
Connection connection = factory.newConnection(); // 获取连接
Channel channel = connection.createChannel(); // 声明一个direct交换类型
channel.exchangeDeclare(EXCHANGE_NAME, "direct"); // 当声明队列,不加任何参数,产生的将是一个临时队列,getQueue返回的是队列名称
String queueA = channel.queueDeclare().getQueue();
String queueB = channel.queueDeclare().getQueue();
System.out.println("临时队列:" + queueA);
System.out.println("临时队列:" + queueB); // 第三个参数为“绑定建”
channel.queueBind(queueA, EXCHANGE_NAME, "error");
channel.queueBind(queueB, EXCHANGE_NAME, "info");
channel.queueBind(queueB, EXCHANGE_NAME, "warning"); Consumer consumerA = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String recv = new String(body, "UTF-8");
System.out.println("Direct-Receive-A:" + recv);
}
};
Consumer consumerB = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String recv = new String(body, "UTF-8");
System.out.println("Direct-Receive-B:" + recv);
}
};
channel.basicConsume(queueA, true, consumerA);
channel.basicConsume(queueB, true, consumerB);
}
}
先启动消费者:再启动生产者,查看控制台:

..

RabbitMQ入门-路由-有选择的接受消息的更多相关文章
- RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:7、保障消息不重复消费:产生消息的唯一ID。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门 (Go) - 2. 发布和接收消息
本文我将使用 Go 语言在 RabbitMQ 上发布和接收消息. Go 的标准库本身并没有 RabbitMQ 的原生绑定,但是有一个第三方库确能够支持 RabbitMQ,它的源码在 https://g ...
- RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:3、基础编码:官方SDK的引用、链接创建、单例改造、发送消息、接收消息。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:2、基础含义理解:链接、通道、队列、交换机
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:5、基础编码:交换机的进阶介绍及编码方式。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
随机推荐
- Algorithm Visualizer
Algorithm Visualizer https://algorithm-visualizer.org/ https://algorithm-visualizer.org/divide-and-c ...
- lr分布式测试--笔记
LR 架构: controller做测试控制 scenario做测试场景的控制 vuser模拟用户和 load generator做负载产生 通过MI listener 跨防火墙监听 来实现分布式测试 ...
- todo项目总结
vue+webpack项目工程配置 1.vue-loader+webpack项目配置 2.webpack配置项目加载各种静态资源 3.webpack-dev-server的配置和使用 安装: pack ...
- python 读取csv 数据并画图分析
数据源 : https://pan.baidu.com/s/1eR593Uy 密码: yqjh python环境 python3 #encoding: utf-8 import csv impo ...
- SELECT IDENT_CURRENT(tableName)和自增长列的纠结
项目中要用到一个功能:主表主键为自增长,要求在插入主表数据前先获得主表要插入数据的主键ID值,用在插入子表时获取主键ID.在网上搜了一下,发现SELECT IDENT_CURRENT(TableNam ...
- How to install Lion on PC
open 'InstallESD.dmg' open '/Volumes/Mac OS X Install ESD/BaseSystem.dmg' rm '/Volumes/Mac OS X Base ...
- npm 和package.json 文件
你可能还记得使用vue-cli 创建vue项目.当创建项目完成后,我们进入到项目目录,启动cmd命令窗口,输入npm install,它就会安装一堆东西(依赖),然后再输入npm run dev, 我 ...
- Nginx 反向代理如何连接上游服务器
L:92 想上游服务器先建立TCP连接 如三次握手 下面指令可以控制握手时间 proxy_next_upstream 指令当出现502可以换个上游服务器 Tcp keepalive 一般都是由进程在 ...
- ubuntu终端快捷键
ctrl+alt+t 新终端 ctrl+shift+t打开新的标签页 ctrl+d关闭终端 ctrl+s 暂停屏幕输出 ctrl+q 继续屏幕输出 ctrl+l 清屏 ctrl+alt+f1 切换到第 ...
- P1280 尼克的任务 dp
思路: 倒着DP f[i]表示i时刻的空闲时间最大值 在当前时间没有任务开始 f[i]=f[i+1]+1; 上一分钟最大空闲时间+1 在当前时间有任务开始 f[i]=max(f[i],f[i ...