下面我们将要实现这个模型,所有的代码将都是以这个模型为基础:

direct:

首先,我们设置的routingKey是 error,那么按照路由规则,我们最终将向这两个队列发送消息:

生产者:

public class Send {private static final String EXCHANGE_NAME = "test_exchange_direct";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = RabbitConnection.getConnection();Channel channel = connection.createChannel();channel.exchangeDeclare(EXCHANGE_NAME, "direct");//send a msgString msg = "hello direct";String routingKey = "info";  //这里是定义的routingKeychannel.basicPublish(EXCHANGE_NAME, routingKey, null, msg.getBytes());System.out.println("send:"+msg);channel.close();connection.close();}
}

消费者1:(他只能接受error

public class ReceiveOne {private static final String QUEUE_NAME = "receive1_queue";private static final String EXCHANGE_NAME = "test_exchange_direct";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = RabbitConnection.getConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);channel.basicQos(1);String routingKey = "error";  //表示只能接收errorchannel.queueBind(QUEUE_NAME, EXCHANGE_NAME, routingKey);DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [ConsumerOne is] Received '" + message + "'");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}finally {channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);  //这里是手动应答}};boolean autoAck = false;channel.basicConsume(QUEUE_NAME, autoAck, deliverCallback, consumerTag -> { });}
}

消费者2:(能接收error,info 和 warning

public class ReceiveTwo {private static final String QUEUE_NAME = "receive2_queue";private static final String EXCHANGE_NAME = "test_exchange_direct";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = RabbitConnection.getConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);channel.basicQos(1);// 设置了三种keychannel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "error"); //注意这里,我们设置了三个路由keychannel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "info");channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "warning");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [ConsumerTwo is] Received '" + message + "'");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}finally {channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);  //这里是手动应答}
};boolean autoAck = false;channel.basicConsume(QUEUE_NAME, autoAck, deliverCallback, consumerTag -> { });}
}

Topics:(模式匹配)

“#” 匹配一个或多个
“ * ” 匹配一个

用法和上面的差不多,具体可以看 官方例子 。


下面再补充一点例子,关于message属性的例子:
Send.java

public class Send {private static final String QUEUE_NAME = "simple_mq";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = RabbitConnection.getConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "hello simple_mq";Map<String,Object> headpro = new HashMap<>();headpro.put("name","king");AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder().deliveryMode(2).contentEncoding("utf-8").expiration("10000").headers(headpro).build();try {channel.txSelect();channel.basicPublish("", QUEUE_NAME, properties, message.getBytes());channel.txCommit();} catch (IOException e) {channel.txRollback();System.out.println("回滚~~");}System.out.println(" [x] Sent.......... '" + message + "'");channel.close();connection.close();}
}

这里我们主要看一下这段代码:

Map<String,Object> headpro = new HashMap<>();headpro.put("name","king");AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder().deliveryMode(2).contentEncoding("utf-8").expiration("10000").headers(headpro).build();try {channel.txSelect();channel.basicPublish("", QUEUE_NAME, properties, message.getBytes());

我们以流式的方式给message添加各种属性

RabbitMQ——路由模式相关推荐

  1. RabbitMQ路由模式

    路由模式 一个生产者,发送消息 每个消费者,都有一个独立的队列 消息发送到交换机,交换机发送到每个队列 根据key,是否相等,来接收消息 Send 生产者 package cn.itcast.rabb ...

  2. RabbitMQ路由模式(direct)

    1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机 ...

  3. 【夏目鬼鬼分享】RabbitMQ路由模式

    路由模式 路由模式是可以根据路由键选择性给多个消费者发送消息的模式,它包含一个生产者.两个消费者.两个队列和一个交换机.两个消费者同时绑定到不同的队列上去,两个队列通过路由键绑定到交换机上去,生产者发 ...

  4. (需求实战_进阶_03)SSM集成RabbitMQ 路由模式关键代码讲解、开发、测试

    接上一篇:(企业内部需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/10421403 ...

  5. 【转】RabbitMQ六种队列模式-4.路由模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 [本文] RabbitMQ六种队列 ...

  6. RabbitMQ(六) Routing路由模式

    概述 所谓RabbitMq中路由模式(Routing)为我们在将发送消息队列以及接收消息队列(queue)绑定到交换机(exchange)时指定了一个RoutingKey.然后我们在通过连接信道向交换 ...

  7. 【RabbitMQ】基础四:路由模式(Routing)

    [RabbitMQ]基础四:路由模式(Routing) 1. 路由模式说明 2. 代码示例 2.1 生产者 2.2 消费者1 2.3 消费者2 2.4 测试 3. 总结 1. 路由模式说明 路由模式特 ...

  8. RabbitMQ的Routing 路由模式(Direct)

    RabbitMQ的Routing 路由模式 模式说明: 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key) 消息的发送方在向 Exchange 发送消息时,也必须 ...

  9. RabbitMQ系列笔记广播模式和路由模式

    导语 上一节介绍了简单的工作模式,即一个队列可以被多个消费者进行消费,只有一条消息被送到消费者,采用公平调度的方式,在以往的例子中似乎我们还没用到交换器进行发送消息,我们都知道,往队列里发送消息,是需 ...

最新文章

  1. java游戏移动_java - Java游戏 - 如何让敌人移动? - SO中文参考 - www.soinside.com
  2. Ant Design源码分析(三):Wave组件
  3. Win10双系统CentOS7安装完无法启动Win10的解决方法
  4. 错误:“Cannot load JDBC driver class ‘com.mysql.jdbc.Driver”的解决方法
  5. 介绍了Oracle数据库锁的种类及研究
  6. style和theme:一组属性值
  7. 如何给小白解释什么是编解码器
  8. 三层架构---理论篇
  9. 物联网避坑 3 大指南!
  10. Ethernet帧结构
  11. python webserver模块,python探索之BaseHTTPServer-实现Web服务器介绍
  12. 苏宁推出物联网应用“云居”
  13. R_地图上的迷你直方图
  14. 【数据结构笔记01】什么是数据结构
  15. 39. 确保判别式是纯函数
  16. 关于卡巴斯基KEY被列入黑名单的问题
  17. 敏感关键词 词库_关键词优化难度分析怎么做?老鸟如何一键筛选优质关键词(悬赏1元)...
  18. win7连接共享打印机时安装驱动程序出现0x00000bcb错误
  19. php如何让图片自适应屏幕,css如何让图片自适应屏幕大小
  20. c#获取软件版本、windows用户名、windows用户目录、.net版本、windows版本等

热门文章

  1. 如何升级PowerShell
  2. 实现简单的ImageLoader
  3. 《转载》struts旅程《2》
  4. 《CLR via C#》读书笔记 之 基元类型、引用类型和值类型
  5. 洛谷 P1352 没有上司的舞会【树形DP/邻接链表+链式前向星】
  6. python 用PIL Matplotlib处理图像的基本操作
  7. 【转载】ArrayList 中数据删除 fail fast
  8. heartbeat与keepalived对比
  9. 设计模式之观察者模式(Java)
  10. nmap中文使用手册