当前位置:网站首页>消息队列的使用
消息队列的使用
2022-06-27 11:56:00 【瑾琳】
3.1 RabbitMQ的核心:
核心官网有介绍,说的connecnton,channel之类的,到底怎么样,who care?
总体来看,我们关注业务实现是:1)消息怎么投递的。2)消费者怎么消费消息。3)消息是否是可靠投递。4)消息投递方式。5)消息的生命周期。6)消息队列生命周期
3.2 消息是怎么投递的?(记住一点,生产者消息投递都是面向交换机的)
RabbitMQ 是面向交换机投递消息的。交换机可能绑定有许多队列,交换机如何将消息投递给这些队列呢?
首先说一下面向交换机的设计的优势:1)这明显借助了数据链路层那个交换机的设计思想。除了层级分明以外,还能从分提高链路利用率(可能有点抽像)。
2)从代码层面来看:如果没有交换机,你至少得维护一个十分庞大的路由表,然后从路由表正确投递消息,有了交互机,这里路
由表就会被拆分到多个交换机里面,效果不必多说。
3)然后就是高度的解耦,不同的交换机可有不同的路由规则,要是没有交换机。。。。。。
在RabbitMQ,交换机有4种投递方式,就是枚举类BuiltinExchangeType的4个枚举变量:
DIRECT:会将所有消息先取消息的ROUTE_KEY,然后投递到与ROUTE_KEY绑定的队列里面(if(msg.routekey.equals(queue.routekey)))。
FANOUT:此种模式下,根本不检查消息的ROUTE_KEY,直接投送到交换机所拥有的所有队列里面。
TOPIC,HEADERS自行看一下官网怎么说的,不想码字了^_^||
总结起来就一个函数就把消息发出去了:channel.basicPublish(excange_name,route_key,false,bs,"test".getBytes());可以去官网查一下这个API
3.3 消费者怎么消费消息(记住一点,消费者消费消息是面向消息队列的,这与生成者有点不一样)
还不是就是TCP长连接心跳的那些事,就是这么一个API:channel.basicConsume(QUEUE_AUTODELETE, true, consumer);consumer是Consumer类的一个实例,
你直接去处理回调接口就ok了
3.4 消息传递是否可靠
很明显是可靠的,除非你将消息队列,声明成非持久模式,这事你又重启了机器。这会丢失消息的。还有就是他有应答机制,你可以通过设置消费者消费消息的模式,
去手动应答。channel.basicConsume(?,autoACk,?)的autoAck参数设置
3.5 消息的生命周期
一旦受到消费者应答,标识消息已被消费,则消息被回收掉。
3.6 队列生命周期
channel.queueDeclare(QUEUE_NAME,false,false,true,null);
第二个参数设置为true,会将消息持久化到磁盘,第四个参数设置为true表示没有消息并且没有连接则删除改队列,详情可以查一下API
四、一个示例
4.1 生产者代码:
自行导入相关依赖包或相关依赖
复制代码
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("username");
factory.setPort(5672);//注意这里的端口与管理插件的端口不一样
factory.setPassword("pwd");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//声明一个dirent模式的交换机
channel.exchangeDeclare("exchange_name",BuiltinExchangeType.DIRECT,true);
//声明一个非持久化自动删除的队列
channel.queueDeclare("queue_name",false,false,true,null);//如果该队列不在被使用就删除他 zhe
//将绑定到改交换机
channel.queueBind("queue_name","exchange_name","route_key");
//声明一个消息头部
Map<String,Object> header=new HashMap<>();
AMQP.BasicProperties.Builder b= new AMQP.BasicProperties.Builder();
header.put("charset","utf-8");
b.headers(header);
AMQP.BasicProperties bp=b.build();
//将消息发出去
channel.basicPublish("exchange_name","route_key",false,bp,"test3".getBytes());
复制代码
4.2 消费者代码
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("username");
factory.setPort(5672);//注意这里的端口与管理插件的端口不一样
factory.setPassword("pwd");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//声明一个dirent模式的交换机
channel.exchangeDeclare("exchange_name",BuiltinExchangeType.DIRECT,true);
//声明一个非持久化自动删除的队列
channel.queueDeclare("queue_name",false,false,true,null);//如果该队列不在被使用就删除他 zhe
//将绑定到改交换机
channel.queueBind("queue_name","exchange_name","route_key");
Consumer consumer = new DefaultConsumer(channel) {
@Override
public 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 + "'");
}
};
channel.basicConsume("queue_name", true, consumer);
边栏推荐
- mysql学习1:安装mysql
- 亚马逊测评掉评、留不上评是怎么回事呢?要如何应对?
- C/s architecture
- 千万不要错过,新媒体运营15个宝藏公众号分享
- 优博讯出席OpenHarmony技术日,全新打造下一代安全支付终端
- 深入理解 happens-before 原则
- Popular science of device review: popular science of innovative medical device series - sternum plate products
- Daily leetcode force deduction (21~25)
- R语言glm函数构建二分类logistic回归模型(family参数为binomial)、使用AIC函数比较两个模型的AIC值的差异(简单模型和复杂模型)
- StarCraft's Bug King ia retired for 2 years to engage in AI, and lamented that it was inferior
猜你喜欢

进程间通信详解

Research Report on the overall scale, major manufacturers, major regions, products and application segments of hydraulic torque in the global market in 2022

alibaba jarslink

Tidb 6.0: making Tso more efficient tidb Book rush

Mathematical knowledge -- ideas and examples of game theory (bash game, Nim game, wizov game)

今晚战码先锋润和赛道第2期直播丨如何参与OpenHarmony代码贡献

想学好C语言,操作符也很重要

mysql学习1:安装mysql

AUTOCAD——三种修剪方式

秒云荣获《2022爱分析 · IT运维厂商全景报告》智能运维AIOps市场代表厂商
随机推荐
I.MX6ULL启动方式
nifi从入门到实战(保姆级教程)——身份认证
R语言使用epiDisplay包的followup.plot函数可视化多个ID(病例)监测指标的纵向随访图、使用stress.labels参数在可视化图像中为强调线添加标签信息
解开C语言的秘密《关键字》(第六期)
Write it down once Net analysis of a property management background service stuck
alibaba jarslink
Unity Shader学习(二)第一个Shader
In 2021, the global carbon graphite brush revenue is about US $2366million, and it is expected to reach US $2701.8 million in 2028
[high frequency interview questions] difficulty 1.5/5, LCS template questions
MySQL高阶语句(一)
Shell script learning notes
How to adjust an integer that is entered in Excel but always displays decimals?
R language uses the poisgof function of epidisplay package to test the goodness of fit of Poisson regression and whether there is overdispersion
JSP自定义标签
R语言dplyr包arrange函数排序dataframe数据、通过多个数据列排序dataframe数据、指定第一个字段降序排序,第二字段不指定(默认升序排序)
MapReduce原理剖析(深入源码)
Building crud applications in golang
盘点一些好用且小众的 Markdown 编辑器
Usage of rxjs mergemap
Talk about go language and cloud native technology