RabbitMQ——路由模式
下面我们将要实现这个模型,所有的代码将都是以这个模型为基础:
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——路由模式相关推荐
- RabbitMQ路由模式
路由模式 一个生产者,发送消息 每个消费者,都有一个独立的队列 消息发送到交换机,交换机发送到每个队列 根据key,是否相等,来接收消息 Send 生产者 package cn.itcast.rabb ...
- RabbitMQ路由模式(direct)
1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机 ...
- 【夏目鬼鬼分享】RabbitMQ路由模式
路由模式 路由模式是可以根据路由键选择性给多个消费者发送消息的模式,它包含一个生产者.两个消费者.两个队列和一个交换机.两个消费者同时绑定到不同的队列上去,两个队列通过路由键绑定到交换机上去,生产者发 ...
- (需求实战_进阶_03)SSM集成RabbitMQ 路由模式关键代码讲解、开发、测试
接上一篇:(企业内部需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/10421403 ...
- 【转】RabbitMQ六种队列模式-4.路由模式
前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 [本文] RabbitMQ六种队列 ...
- RabbitMQ(六) Routing路由模式
概述 所谓RabbitMq中路由模式(Routing)为我们在将发送消息队列以及接收消息队列(queue)绑定到交换机(exchange)时指定了一个RoutingKey.然后我们在通过连接信道向交换 ...
- 【RabbitMQ】基础四:路由模式(Routing)
[RabbitMQ]基础四:路由模式(Routing) 1. 路由模式说明 2. 代码示例 2.1 生产者 2.2 消费者1 2.3 消费者2 2.4 测试 3. 总结 1. 路由模式说明 路由模式特 ...
- RabbitMQ的Routing 路由模式(Direct)
RabbitMQ的Routing 路由模式 模式说明: 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key) 消息的发送方在向 Exchange 发送消息时,也必须 ...
- RabbitMQ系列笔记广播模式和路由模式
导语 上一节介绍了简单的工作模式,即一个队列可以被多个消费者进行消费,只有一条消息被送到消费者,采用公平调度的方式,在以往的例子中似乎我们还没用到交换器进行发送消息,我们都知道,往队列里发送消息,是需 ...
最新文章
- java游戏移动_java - Java游戏 - 如何让敌人移动? - SO中文参考 - www.soinside.com
- Ant Design源码分析(三):Wave组件
- Win10双系统CentOS7安装完无法启动Win10的解决方法
- 错误:“Cannot load JDBC driver class ‘com.mysql.jdbc.Driver”的解决方法
- 介绍了Oracle数据库锁的种类及研究
- style和theme:一组属性值
- 如何给小白解释什么是编解码器
- 三层架构---理论篇
- 物联网避坑 3 大指南!
- Ethernet帧结构
- python webserver模块,python探索之BaseHTTPServer-实现Web服务器介绍
- 苏宁推出物联网应用“云居”
- R_地图上的迷你直方图
- 【数据结构笔记01】什么是数据结构
- 39. 确保判别式是纯函数
- 关于卡巴斯基KEY被列入黑名单的问题
- 敏感关键词 词库_关键词优化难度分析怎么做?老鸟如何一键筛选优质关键词(悬赏1元)...
- win7连接共享打印机时安装驱动程序出现0x00000bcb错误
- php如何让图片自适应屏幕,css如何让图片自适应屏幕大小
- c#获取软件版本、windows用户名、windows用户目录、.net版本、windows版本等