(一)routing路由模式

在前面一篇博客中讲到了exchange的类型,其中direct类型的exchange就是用于routing路由模式。direct类型的交换机是指:交换机和队列绑定时会设置路由键(routingkey),当消息从生产者发送给交换机时也会发送一个路由键。只有当这两个路由键相同时,交换机才会把消息发送给队列。

如上图所示,当生产者发送消息的路由键为error时,两个队列均可以收到消息;当生产者发送消息的路由键为info或warning时,只有第二个队列可收到消息。

(二)路由模式实践

2.1 工具类

工具类和之前都一样,不做介绍了

public class ConnectionUtil {public static Connection getConnection() throws IOException, TimeoutException {//定义一个连接工厂ConnectionFactory factory=new ConnectionFactory();//设置服务地址factory.setHost("127.0.0.1");//设置AMQP端口factory.setPort(5672);//设置VHOSTSfactory.setVirtualHost("/vhosts_sdxb");//设置用户名factory.setUsername("user_sdxb");factory.setPassword("123456");return factory.newConnection();}
}

2.2 生产者

与前面几种模式不同的地方已经通过注解标出,其中交换机类型选择成direct,并且按需要设置路由键

public class Sent {private static final String EXCHANGENAME="routing_exchange";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = ConnectionUtil.getConnection();Channel channel = connection.createChannel();//交换机类型选择directchannel.exchangeDeclare(EXCHANGENAME,"direct");String msg="hello world";//设置路由键(routingkey)String routingkey="error";channel.basicPublish(EXCHANGENAME,routingkey,null,msg.getBytes());channel.close();connection.close();}
}

2.3 消费者一

在队列绑定时设置队列的路由键

public class Receive1 {private static final String QUEUENAME="routing_queue1";private static final String EXCHANGENAME="routing_exchange";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = ConnectionUtil.getConnection();final Channel channel = connection.createChannel();channel.queueDeclare(QUEUENAME, false, false, false, null);//在队列绑定时设置路由键channel.queueBind(QUEUENAME, EXCHANGENAME, "error");Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String msg = new String(body, "utf-8");System.out.println("receive:" + msg);}};//监听队列channel.basicConsume(QUEUENAME, true, consumer);}
}

2.4 消费者二

在第二个消费者的队列中设置多个路由键

public class Receive2 {private static final String QUEUENAME="routing_queue2";private static final String EXCHANGENAME="routing_exchange";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = ConnectionUtil.getConnection();final Channel channel = connection.createChannel();channel.queueDeclare(QUEUENAME, false, false, false, null);//在队列绑定时设置多个路由键channel.queueBind(QUEUENAME, EXCHANGENAME, "error");channel.queueBind(QUEUENAME, EXCHANGENAME, "info");channel.queueBind(QUEUENAME, EXCHANGENAME, "warning");Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String msg = new String(body, "utf-8");System.out.println("receive:" + msg);}};//监听队列channel.basicConsume(QUEUENAME, true, consumer);}
}

2.5运行结果

当路由键为error时,两个消费者均输出消息。当路由键为info或warning时,只有第二个消费者输出消息。

(三)Topic主题模式

Topic主题模式和routing路由模式类似,只不过这里的交换机使用的是topic类型,topic类型的交换机和direct的不同就在于topic可以匹配通配符。*代表匹配一个元素,#代表匹配一个或多个元素

以上图为例,Q1队列的路由键为*.orange.*,Q2队列的路由键为*.*.rabbit和lazy.#,当消息的路由键为quick.orange.rabbit时,两个队列均能收到,当消息的路由键为lazy.orange.male.rabbit时,只有Q2队列能收到。

(四)主题模式实践

在routing路由模式的代码基础上修改

4.1 生产者

//交换机类型选择direct
channel.exchangeDeclare(EXCHANGENAME,"topic");
//设置路由键(routingkey)
String routingkey="lazy.brown.fox";

4.2 消费者一

channel.queueBind(QUEUENAME, EXCHANGENAME, "*.orange.*");

4.3 消费者二

channel.queueBind(QUEUENAME, EXCHANGENAME, "*.*.rabbit");
channel.queueBind(QUEUENAME, EXCHANGENAME, "lazy.#");

修改以上几处地方就实现了上述topic模型

RabbitMQ学习系列(五):routing路由模式和Topic主题模式相关推荐

  1. Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  2. Linux学习系列五:Shell命令脚本的基本语法

    这个系列的Linux教程主要参考刘遄老师的<Linux就该这么学>.用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间 ...

  3. RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列

    上一篇已经讲了Rabbitmq如何在Windows平台安装,不懂请移步:RabbitMQ学习系列一:windows下安装RabbitMQ服务 一.理论: .net环境下,C#代码调用RabbitMQ消 ...

  4. idea学习系列五之debug及插件的使用

    idea学习系列五之debug及插件的使用 上一篇,介绍了maven及服务器的使用,这里将介绍idea中debug及插件的使用.在实际开发中debug是最常用的了,而且idea相比于eclipse中的 ...

  5. (八)RabbitMQ消息队列-通过Topic主题模式分发消息

    前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过routingkey来匹配消息的模式已经有一定了解那fanout也很好 ...

  6. SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

    前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...

  7. RabbitMQ学习系列(六): RabbitMQ 高可用集群

    前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用.不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/ca ...

  8. laravel5.0学习系列1之 路由

    Laravel5.0学习系类一路由 最近因为实习工作的需要,在学习者php的框架--laravel. 因为网上没有找到相关方面的基础学习资料,加上最近自己在学习,于是就记下相关知识!方便以后查阅 la ...

  9. RabbitMQ学习(十五):消极确认(Negative Acknowledgements)

    说明 在之前的一篇博文<RabbitMQ学习(十三):死信交换机 (Dead Letter Exchanges)>中我们了解到,消息变为死信有三个原因,其中就有因为消费者的消极确认(neg ...

最新文章

  1. LeetCode简单题之判断句子是否为全字母句
  2. 微信小程序实现滑动tab切换和点击tab切换并显示相应的数据(附源代码)
  3. 望图知意-Yahoo VS 3721
  4. Eclipse / Java代码完成无法正常工作
  5. FISCO BCOS Failed to connect to nodes: [ ssl hanshake failed:/192.168.64.131:20200]
  6. 微软制作win7启动U盘的工具
  7. php gethostbyname ipv6,支持IPV6方法
  8. 微信小程序从云存储中读取图片
  9. 图片转Excel表格 文字识别 表格识别
  10. 个人博客如何选择图床
  11. Windows10系统C盘文件实际大小占用空间和可用空间不一致(相差差8到20G)
  12. 深圳大学 计算机 教育部学科,深圳大学有13个A类学科,位居全国第24!
  13. 需求工程之原型法获取需求
  14. 下列符号中 表示python中单行注释的是_下列符号中,表示Python中单行注释的是...
  15. 产品经理必备知识之如何全方位进行表单设计,一文带你通读表单设计的全过程
  16. 持续集成(CI)系统
  17. 快播3.5不升级版常见问题
  18. Unity3D编程之NGUI和UGUI比较
  19. 官网下载java mysql_jdbc驱动包(图文)
  20. 智能制造整体解决方案(工业4.0与中国智造2025)

热门文章

  1. 10__jsp入门el表达式入门CookieSession
  2. 使用freemarker模板生成带图片的word--html格式
  3. OpenDayLight(镁版本安装)
  4. [YTU]2600: 编程题A-无字天书
  5. Vue Component标签
  6. (结构体+指针)定义“车”结构体,实现改变车颜色,车牌操作
  7. CM5800内置 100V/5A MOS 宽输入电压降压型 DC-DC
  8. X509Certificate2 系统找不到指定的文件
  9. 小程序上传代码报错,超过2M---解决方案
  10. 艾永亮:靠二次元起家的B站如何赢得1.3亿活跃用户?