博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RabbitMQ入门-路由-有选择的接受消息
阅读量:6746 次
发布时间:2019-06-25

本文共 3329 字,大约阅读时间需要 11 分钟。

比如一个日志系统,之前的处理方式呢,是各种类型(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);    }}

 

 

先启动消费者:再启动生产者,查看控制台:

..

 

转载于:https://www.cnblogs.com/LUA123/p/8477189.html

你可能感兴趣的文章
扫描整个网段的所有,查看主机是否在线
查看>>
Swing中支持自动换行的WrapLayout
查看>>
python 未发现数据源名称并且未指定默认驱动程序
查看>>
[Web 前端] react-router4-0中文文档
查看>>
解决SpringBoot更新数据到MySQL乱码问题
查看>>
hasura graphql 模式拼接demo
查看>>
libcgi库安装
查看>>
小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向
查看>>
百度启动高管退休计划,总裁张亚勤今年十月退休
查看>>
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增“行政区域管理”,同时大批量树采用异步加载...
查看>>
SpringBoot启动时的Banner设置
查看>>
xming + putty 搭建远程图形化ssh访问ubuntu 14.04
查看>>
rabbitmq 重复ACK导致消息丢失
查看>>
【Sigma敏捷版系列文章】从运行流程和list-watch看kubernetes系统的设计理念
查看>>
两列布局——但只用右浮动
查看>>
GNOME 网页浏览器 Epiphany 将要进行 5 项改进
查看>>
今年CES最大亮点:智能语音助手正成为新趋势
查看>>
Windows Mysql Server重启, log-bin路径配置
查看>>
刘剑锋:友云采助力企业数字化采购的新发展
查看>>
Rainbond 5.0.4 发布,做最好用的云应用操作系统
查看>>