RabbitMQ自学入门
// 连接RabbitMQ 简单工具类
public static Connection getConnection() throws Exception {
//1. 定义一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2. 获取服务地址
factory.setHost("127.0.0.1");
//3. AMQP 5672
factory.setPort(5672);
//4. vhost
factory.setVirtualHost("/test");
//5. 用户名
factory.setUsername("test");
//6. 密码
factory.setPassword("test");
return factory.newConnection();
}
// 获取连接,生成通道
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
1)simple - 简单队列
涉及3个对象: 生产者 队列 RabbitMQ 消费者
生产者:
// 申明队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
// 推送信息
channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());
消费者:
// 申明队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
DefaultConsumer consumer = new DefaultConsumer(channel) {
//获取到达的消息
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg = new String(body, "utf-8");
// 消费消息
System.out.println("new api recv: " + msg);
}
};
//4. 监听队列
channel.basicConsume(QUEUE_NAME,true,consumer);
缺点:耦合性高,生产者一 一对应消费者。
2)work queues - 工作队列
channel.basicQos(1); //保证每次只分发一个
boolean autoAck = true;
channel.basicConsume(QUEUE_NAME,autoAck,consumer);
autoAck true 代表自动应答,
false代表需要如下手动应答:
channel.basicAck(envelope.getDeliveryTag(),false);
轮询分发:自动应答,任务消息总是均匀分配
公平分发:手动应答,能者多劳
3)消息持久化
Boolean durable = true;// 持久化,注意在已存在的队列上修改是不行的,可以删除原有队列或重新生成队列。
channel.queueDeclare(QUEUE_NAME,durable ,false,false,null);
4)订阅模式 publish/subscribe
- 一个生产者,多个消费者
- 每一个消费者都有自己的队列
- 生产者没有直接把消息发送到队列 而是发送到了交换机 转发器(exchange)
- 每个队列都要绑定到交换机上,
- 生产者发送的消息 经过交换机 达到队列 就能实现一个消息被多个消费者消费
生产者:
channel.exchangeDeclare(EXCHANGE_NAME,"fanout"); // 声明交换机,"fanout"为分发
消费者:
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"");//绑定队列到交换机转发器
5)Exchange(交换机 转发器)
一方面是接收生产者的消息,另一方面是向队列推送消息。
匿名转发 ""
fanout(不处理路由键)
direct (处理路由器)
6)路由模式
生产者:
channel.exchangeDeclare(EXCHANGE_NAME,"direct"); // 声明交换机
String routingKey = "info"; // error、warn.. 绑定路由
channel.basicPublish(EXCHANGE_NAME,routingKey ,null,msg.getBytes());
消费者:
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"info");// 消费者绑定到路由
7)事务机制
txSelect txCommit txRollback
txSelect:用户将当前 channel 设置成 transaction 模式
txCommit :用于提交事务;
txRollback:回滚事务。
这种模式很耗时,采用这种方式,降低了 RabbitMQ 的消息吞吐量
8)Conform 模式
生产者端 conform 模式的实现原理:
生产者将信道设置成 conform 模式,一旦信道进入 conform 模式,所有在该信道上面发布的消息都会被指派一个唯一的 ID(从 1 开始),一旦消息被投递到所有匹配的队列之后,broker 就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经到达目的队列了,如果消息和队列是持久化的,那么确认消息会将消息写入磁盘之后发出,broker 也可以设置 basic.ack 的 multiple 域,表示到这个序列号之前的所有消息都已经得到了处理。
Conform 模式最大的好处就是他是异步。
开启 conform 模式 Channel.conformSelect()
编程模式:
①普通 发一条 waitForConfirms()
②批量的 发一批 channel.waitForConfirmsOrDie(); //直到所有信息都发布,只要有一个未确认就会IOException
③异步 conform 模式:提供一个 回调方法
异步模式:
channel 对象提供的 ConfirmListener() 回调方法只包含 deliveryTag (当前 channel 发出的消息序列),我们需要自己为每一个 Channel 维护一个 unconfirm 的消息序号集合,每 publish 一条数据,集合中元素加 1 ,每回调一次 handleAck 方法,unconfirm 集合删掉相应的一条(multiple = false)或多条(multiple = true)记录。从程序运行效率上看,这个 unconfirm 集合最好采用有序集合 SortedSed 存储结构。
例如:
SortedSet<Long> confirmSet = Collections.synchronizedSortedSet(new TreeSet<Long>());
channel.confirmSelect();
channel.addConfirmListener(new ConfirmListener() {
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
if (multiple) {
confirmSet.headSet(deliveryTag + 1L).clear();
} else {
confirmSet.remove(deliveryTag);
}
}
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
if (multiple) {
confirmSet.headSet(deliveryTag + 1L).clear();
} else {
confirmSet.remove(deliveryTag);
}
}
});
RabbitMQ自学入门相关推荐
- RabbitMQ(一):RabbitMQ快速入门
RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要对RabbitMQ有所了解,本文是RabbitMQ快速入门文章,主要内容包括Rab ...
- WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...
WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正 ...
- rabbitmq详细入门文档+springboot结合使用
在介绍RabbitMQ之前,我们先来看下面一个电商项目的场景: 商品的原始数据保存在数据库中,增删改查都在数据库中完成. 搜索服务数据来源是索引库(Elasticsearch),如果数据库商品发生变化 ...
- RabbitMQ的入门程序test测试代码
RabbitMQ有以下几种工作模式 : 1.Work queues 工作队列 2.Publish/Subscribe 发布订阅 3.Routing 路由 4.Topics 通 ...
- python自学行吗-自学入门Python能学会吗?
原标题:自学入门Python能学会吗? 学习 Python,几行代码就可以实现一个爬虫,几个函数就可以做简单的数据分析,写一个小工具.小游戏也是分分钟的事情--这种成就感,会激发你最原始的兴趣.因此就 ...
- python能自学成功吗-自学入门Python能学会吗?
原标题:自学入门Python能学会吗? 学习 Python,几行代码就可以实现一个爬虫,几个函数就可以做简单的数据分析,写一个小工具.小游戏也是分分钟的事情--这种成就感,会激发你最原始的兴趣.因此就 ...
- 543、RabbitMQ详细入门教程系列 -【Confirm与Mandatory】 2022.09.05
目录 一.前言概述 二.SpringAMQP配置Confirm 2.1 Connection设置 2.2 template设置 2.3 Confirm实现 三.SpringAMQP配置ManDator ...
- 【外行也能看懂的RabbitMQ系列(一)】—— RabbitMQ快速入门篇(内含丰富实例)
系列文章目录 准备篇 RabbitMQ安装文档 第一章 RabbitMQ快速入门篇 第二章 RabbitMQ的Web管理界面详解 第三章 RabbitMQ进阶篇之死信队列 第四章 RabbitMQ进阶 ...
- Photoshop完全自学入门与经典实例全视频教程
基本信息 讲师: 李辉 时长:43分钟 集数:20 每集定价:2 元 视频内容: 本套PS视频教程共20讲,分为基础篇和实例篇,各10讲. 基础篇重点介绍了学习Photoshop软件时涉及的有关入门知 ...
最新文章
- VS2010 代码前出现虚线的问题
- 制图折断线_甲级设计院CAD制图技巧与画法讲解! 超实用,值得你收藏~
- Linux技术网站中文,Linux技术网站,putty工具,中文显示设置
- 阿里云前端周刊 - 第 33 期
- php(2)—基础补充
- mysql doen s exist_Mysql中大小写敏感问题导致的MySql Error 1146 Tabel doen’t exist错误
- HTTP 遭 Google 抛弃,开发者该如何应对?
- 苏宁大数据怎么运营_苏宁易购的经营模式
- Ubuntu 18安装谷歌浏览器
- Excel导入SQL数据库出现的问题
- 130242014057 周陈清 实验一
- (栈)栈 给定push序列,判断给定序列是否是pop序列
- linux iconv 文件名,Linux_Linux系统下转换文件编码的方法小结,一、利用iconv命令进行文件内 - phpStudy...
- CentOS安装SVN
- 从头开始聊P问题、NP问题与NPC问题
- [笔记分享] [Camera] msm8x25 camera hal 流程记录
- C#WinForm实现雷速网站比赛MQTT逆向采集
- 如何将PPT压缩后保存
- 跟着Vam一起学习Typescript(第一期)(更新中)
- ctf镜子里面的世界_萌娃照镜子,演绎小脑袋大疑惑,“虚晃一枪”的模样简直萌化了...
热门文章
- Python 遗传算法求解Stackelberg均衡问题(带概率约束)
- 飞康应用——虚拟磁盘和创建SAN资源
- 生信学习——生信人的20个R语言习题(上)(附详细答案解读)
- WampServer环境的搭建
- Java利用EasyPoi实现excel文件导入和导出
- Windows记事本UTF-8编码异常
- Spatially and Temporally Efficient Non-local Attention Net work for Video-based Re-Id 论文笔记
- Rotary Knob Slider
- python博弈树实现AI五子棋小游戏
- 趋势预测方法(一) 多项式拟合(最小二乘法)_函数拟合