Direct 模式

  • 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue。
  • Direct 模式可以使用 RabbitMQ 自带的 Exchange: default Exchange,所以不需要将 Exchange 进行任何绑定(binding)操作。
  • 消息传递时,RouteKey 必须完全匹配才会被队列接收,否则该消息会被抛弃,
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class DirectProducer {public static void main(String[] args) throws Exception {//1. 创建一个 ConnectionFactory 并进行设置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");//2. 通过连接工厂来创建连接Connection connection = factory.newConnection();//3. 通过 Connection 来创建 ChannelChannel channel = connection.createChannel();//4. 声明String exchangeName = "test_direct_exchange";String routingKey = "item.direct";//5. 发送String msg = "this is direct msg";channel.basicPublish(exchangeName, routingKey, null, msg.getBytes());System.out.println("Send message : " + msg);//6. 关闭连接channel.close();connection.close();}
}
import com.rabbitmq.client.*;
import java.io.IOException;public class DirectConsumer {public static void main(String[] args) throws Exception {//1. 创建一个 ConnectionFactory 并进行设置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");factory.setAutomaticRecoveryEnabled(true);factory.setNetworkRecoveryInterval(3000);//2. 通过连接工厂来创建连接Connection connection = factory.newConnection();//3. 通过 Connection 来创建 ChannelChannel channel = connection.createChannel();//4. 声明String exchangeName = "test_direct_exchange";String queueName = "test_direct_queue";String routingKey = "item.direct";channel.exchangeDeclare(exchangeName, "direct", true, false, null);channel.queueDeclare(queueName, false, false, false, null);//一般不用代码绑定,在管理界面手动绑定channel.queueBind(queueName, exchangeName, routingKey);//5. 创建消费者并接收消息Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body)throws IOException {String message = new String(body, "UTF-8");System.out.println(" [x] Received '" + message + "'");}};//6. 设置 Channel 消费者绑定队列channel.basicConsume(queueName, true, consumer);}
}
Send message : this is direct msg[x] Received 'this is direct msg'
Topic 模式

Topic 模式

可以使用通配符进行模糊匹配

  • 符号'#" 匹配一个或多个词
  • 符号"*”匹配不多不少一个词

例如:

  • 'log.#"能够匹配到'log.info.oa"
  • "log.*"只会匹配到"log.erro“
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class TopicProducer {public static void main(String[] args) throws Exception {//1. 创建一个 ConnectionFactory 并进行设置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");//2. 通过连接工厂来创建连接Connection connection = factory.newConnection();//3. 通过 Connection 来创建 ChannelChannel channel = connection.createChannel();//4. 声明String exchangeName = "test_topic_exchange";String routingKey1 = "item.update";String routingKey2 = "item.delete";String routingKey3 = "user.add";//5. 发送String msg = "this is topic msg";channel.basicPublish(exchangeName, routingKey1, null, msg.getBytes());channel.basicPublish(exchangeName, routingKey2, null, msg.getBytes());channel.basicPublish(exchangeName, routingKey3, null, msg.getBytes());System.out.println("Send message : " + msg);//6. 关闭连接channel.close();connection.close();}
}
import com.rabbitmq.client.*;
import java.io.IOException;public class TopicConsumer {public static void main(String[] args) throws Exception {//1. 创建一个 ConnectionFactory 并进行设置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");factory.setAutomaticRecoveryEnabled(true);factory.setNetworkRecoveryInterval(3000);//2. 通过连接工厂来创建连接Connection connection = factory.newConnection();//3. 通过 Connection 来创建 ChannelChannel channel = connection.createChannel();//4. 声明String exchangeName = "test_topic_exchange";String queueName = "test_topic_queue";String routingKey = "item.#";channel.exchangeDeclare(exchangeName, "topic", true, false, null);channel.queueDeclare(queueName, false, false, false, null);//一般不用代码绑定,在管理界面手动绑定channel.queueBind(queueName, exchangeName, routingKey);//5. 创建消费者并接收消息Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body)throws IOException {String message = new String(body, "UTF-8");System.out.println(" [x] Received '" + message + "'");}};//6. 设置 Channel 消费者绑定队列channel.basicConsume(queueName, true, consumer);}
}
Send message : this is topc msg[x] Received 'this is topc msg'
[x] Received 'this is topc msg'

Fanout 模式

不处理路由键,只需要简单的将队列绑定到交换机上发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
Fanout交换机转发消息是最快的。

import com.rabbitmq.client.*;
import java.io.IOException;public class FanoutConsumer {public static void main(String[] args) throws Exception {//1. 创建一个 ConnectionFactory 并进行设置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");factory.setAutomaticRecoveryEnabled(true);factory.setNetworkRecoveryInterval(3000);//2. 通过连接工厂来创建连接Connection connection = factory.newConnection();//3. 通过 Connection 来创建 ChannelChannel channel = connection.createChannel();//4. 声明String exchangeName = "test_fanout_exchange";String queueName = "test_fanout_queue";String routingKey = "item.#";channel.exchangeDeclare(exchangeName, "fanout", true, false, null);channel.queueDeclare(queueName, false, false, false, null);//一般不用代码绑定,在管理界面手动绑定channel.queueBind(queueName, exchangeName, routingKey);//5. 创建消费者并接收消息Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body)throws IOException {String message = new String(body, "UTF-8");System.out.println(" [x] Received '" + message + "'");}};//6. 设置 Channel 消费者绑定队列channel.basicConsume(queueName, true, consumer);}
}
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class FanoutProducer {public static void main(String[] args) throws Exception {//1. 创建一个 ConnectionFactory 并进行设置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");//2. 通过连接工厂来创建连接Connection connection = factory.newConnection();//3. 通过 Connection 来创建 ChannelChannel channel = connection.createChannel();//4. 声明String exchangeName = "test_fanout_exchange";String routingKey1 = "item.update";String routingKey2 = "";String routingKey3 = "ookjkjjkhjhk";//任意routingkey//5. 发送String msg = "this is fanout msg";channel.basicPublish(exchangeName, routingKey1, null, msg.getBytes());channel.basicPublish(exchangeName, routingKey2, null, msg.getBytes());channel.basicPublish(exchangeName, routingKey3, null, msg.getBytes());System.out.println("Send message : " + msg);//6. 关闭连接channel.close();connection.close();}
}
Send message : this is fanout msg[x] Received 'this is fanout msg'
[x] Received 'this is fanout msg'
[x] Received 'this is fanout msg'

rabbitmq direct 多个消费者_一文解析 RabbitMQ 最常用的三大模式相关推荐

  1. rabbitmq多个消费者_为什么要选择RabbitMQ,RabbitMQ简介,各种MQ选型对比

    MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道.以管道的方式做消息传递. 场景: 1.其实我们在双11的时候,当我们凌晨大量的秒杀和抢购商品,然后去结算的时候,就会发现 ...

  2. rabbitmq 查看消费者_(Windows环境下)RabbitMQ系列(一)安装以及入门使用

    一.RabbitMQ介绍 RabbitMQ是一个消息代理:它接受和转发消息.你可以把它想象成一个邮局.在这个比喻中,RabbitMQ是邮政信箱,邮局和邮递员. RabbitMQ和邮局的主要区别在于它不 ...

  3. rabbitmq direct 多个消费者_RabbitMQ实战应用技巧

    1. RabbitMQ实战应用技巧 1.1. 前言 由于项目原因,之后会和RabbitMQ比较多的打交道,所以让我们来好好整理下RabbitMQ的应用实战技巧,尽量避免日后的采坑 1.2. 概述 Ra ...

  4. rabbitmq direct 多个消费者_RabbitMQ从零开始

    什么是RabbitMQ RabbitMQ是一个由ErLang语言编写的实现了AMQP(高级消息队列协议)的开源消息中间件 .RabbitMQ 支持消息的持久化.事务.拥塞控制.负载均衡等特性. 为什么 ...

  5. rabbitmq接口异常函数方法_[项目更新] 集成RabbitMQ队列与EventBus总线

    (Blog.Core框架开发情况,着色部分为本次新增) 终于项目继续迭代更新了,在开源这两年多,也是感谢每一个支持Blog.Core项目的同学,同时也感谢每一个在生产环境中使用,并提出意见和建议的小伙 ...

  6. 累加器A用c语言,累加器A的主要作用是什么_一文解析累加器a和acc的区别

    描述 累加器简介 在中央处理器中,累加器(accumulator) 是一种寄存器,用来储存计算产生的中间结果.如果没有像累加器这样的寄存器,那么在每次计算 (加法,乘法,移位等等) 后就必须要把结果写 ...

  7. oracle组合索引失效_一文看懂Oracle数据库的三大索引类型

    概述 今天主要介绍Oracle数据库的三大索引类型,仅供参考. 一.B-Tree索引 三大特点:高度较低.存储列值.结构有序 1.1利用索引特性进行优化 外键上建立索引:不但可以提升查询效率,而且可以 ...

  8. arduino小车电机不转_一文解析—电机驱动设计方案

    24V无刷直流 (BLDC) 电机正弦波驱动,应用于空气净化器风扇 此参考设计是用于无刷直流 (BLDC) 电机的经济实惠型.小尺寸 (SFF).三相正弦电机驱动,在 24V 时的功率高达 50W.此 ...

  9. 双稳态电路的两个稳定状态是什么_一文解析双稳态开关工作原理

    点击蓝色字免费订阅,每天收到这样的好信息 稳态电路一般有一个输出端和两个输入端("+"."-"端各一个),当输入端的"+"端有触发信号时,输 ...

最新文章

  1. php blocklog_SQLSERVER中的logblock校验(译)
  2. node / npm 配置问题
  3. j详细说明ava于clone办法
  4. java猜字母讲解_JAVA语言中的经典案例:猜字母游戏
  5. Deep Residual Learning for Image Recognition个人有感
  6. 【存储知识学习】第十章- 存储架构演进过程《大话存储》阅读笔记
  7. SpringAOP概念
  8. python函数参数列表_python函数列表
  9. Android学习小Demo(14)Android中关于PopupWindow的使用
  10. 2021中国大学生程序设计竞赛部分题解(CCPC)- 网络选拔赛(重赛)
  11. 报表系统软件有哪些_报表系统软件功能
  12. Hbase+JAVAWeb实现超市仓库管理系统
  13. js获取元素相对于父级元素的高度
  14. Oracle vm visualbox虚拟机双网卡设置-解决主机无法连接靶机的问题
  15. 使用JS创建style标签
  16. 移动互联网实战--移动端音频和图形优化处理
  17. 多目标优化算法:多目标变色龙群优化算法MOCSA(提供MATLAB源码)
  18. 卫片图斑_整治“卫片图斑”,让违建无处可逃!
  19. 百度细雨算法2.0解读
  20. cad剖切线的快捷键_cad剖切符号怎么画

热门文章

  1. ffmpeg提取音频播放器总结
  2. 文件系统:使用 yum 安装软件包
  3. $(“#addLowForm“).serialize()同时提交其它参数的写法
  4. C#指南,重温基础,展望远方!(4)表达式
  5. 13,反转链表《剑指offer》
  6. SPOJ 694/705 后缀数组
  7. 七月算法--12月机器学习在线班-第五次课笔记—回归
  8. iOS项目开发优秀文章汇总
  9. 基于linux-2.6.32.2的servfox移植
  10. CentOS-6.3安装使用MongoDB