微服务——服务异步通讯RabbitMQ
前置文章
消息队列——RabbitMQ基本概念+容器化部署和简单工作模式程序_北岭山脚鼠鼠的博客-CSDN博客
消息队列——rabbitmq的不同工作模式_北岭山脚鼠鼠的博客-CSDN博客
消息队列——spring和springboot整合rabbitmq_北岭山脚鼠鼠的博客-CSDN博客
目录
Work queues 工作队列模式
案例:
在生产者端
在消费者端
结果如下
消费预取限制
发布订阅模型
Fanout Exchange(配置文件实现)
案例
消费者代码
生产者代码
Direct Exchange (注解实现)
案例
消费者代码
生产者代码
Topic Exchange
案例
消费者代码
生产者代码
消息转换器
生产者代码
JSON方式序列化
生产者代码 (jackson)
消费者代码(jackson)
总结
Work queues 工作队列模式
这里用的不是上面第三篇文章里面的定义配置类的形式。
案例:
在生产者端
队列要存在才可以上传。不然代码运行不会报错,但是消息也会不知道发到哪里去。
@Testpublic void testSendMessage2() throws InterruptedException {String queue_Name= "simple.queue";String message="hello 鼠鼠";for(int i=1;i<=50;i++)rabbitTemplate.convertAndSend(queue_Name,message+i);Thread.sleep(20);}
在消费者端
定义了两个消费者监听上面的队列,本来想三个的,但是不知道默认的交换机名字,所以弄了两个。并且根据注解的不同,第一个是可以直接创建一个队列,第二个需要队列已存在才行。
@Component
public class RabbitMQListener {//自动创建队列@RabbitListener(queuesToDeclare=@Queue("simple.queue"))public void ListenerWorkQueue1(Message message) throws InterruptedException {System.out.println("11111"+message.getBody());Thread.sleep(20);}//需要在rabbit_mq上手动创建队列,不然会报错@RabbitListener(queues="simple.queue")public void ListenerWorkQueue2(Message message) throws InterruptedException {System.out.println("22222"+message.getBody());Thread.sleep(200);}//3. 自动创建队列,Exchange 与 Queue绑定
// @RabbitListener(bindings = @QueueBinding(
// value = @Queue("simple.queue"),
// exchange = @Exchange("/") //绑定默认交换机
// ))
// public void ListenerWorkQueue3(Message message) throws InterruptedException {
// System.out.println("33333"+message.getBody());
// Thread.sleep(200);
// }
}
结果如下
两个队列轮流取消息导致反而变慢了。
消费预取限制
要指定队列才有效果。
这里就相当于指定了在simple前缀的队列上每次只能获取一条消息。
运行结果如下,大多数都交给了快的队列执行。
发布订阅模型
Fanout Exchange(配置文件实现)
消息路由到每个绑定的消息队列。
案例
消费者代码
spring读取到这个Bean之后就会向RabbitMq发请求,创建交换机,绑定队列了。
@Configuration
public class FanoutConfig {//itcast.fanout@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("itcast.fanout");}//fanout.queue1@Beanpublic Queue fanoutQueue1(){return new Queue("fannout.queue1");}//绑定队列1到交换机@Beanpublic Binding fanoutBinding1(Queue fanoutQueue1, FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}//fanout.queue1@Beanpublic Queue fanoutQueue2(){return new Queue("fannout.queue2");}//绑定队列2到交换机@Beanpublic Binding fanoutBinding2(Queue fanoutQueue2, FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}
}
定义两个监听用的方法
@Component
public class RabbitMQListener {
// @RabbitListener(queues="boot_queue")
// public void ListenerQueue(Message message){
// System.out.println(message);
// }//自动创建队列// @RabbitListener(queuesToDeclare=@Queue("simple.queue"))
// public void ListenerWorkQueue1(Message message) throws InterruptedException {
// System.out.println("11111"+message.getBody()+ LocalDateTime.now());
// Thread.sleep(20);
// }
//
// //需要在rabbit_mq上手动创建队列,不然会报错
// @RabbitListener(queues="simple.queue")
// public void ListenerWorkQueue2(Message message) throws InterruptedException {
// System.out.println("22222"+message.getBody()+ LocalDateTime.now());
// Thread.sleep(200);
// }//3. 自动创建队列,Exchange 与 Queue绑定
// @RabbitListener(bindings = @QueueBinding(
// value = @Queue("simple.queue"),
// exchange = @Exchange("/") //绑定默认交换机
// ))
// public void ListenerWorkQueue3(Message message) throws InterruptedException {
// System.out.println("33333"+message.getBody());
// Thread.sleep(200);
// }@RabbitListener(queuesToDeclare=@Queue("fanout.queue1"))public void ListenerFanoutQueue1(Message message) throws InterruptedException {System.out.println("11111"+message.getBody());}@RabbitListener(queuesToDeclare=@Queue("fanout.queue2"))public void ListenerFanoutQueue2(Message message) throws InterruptedException {System.out.println("22222"+message.getBody());}
}
生产者代码
@SpringBootTest
@RunWith(SpringRunner.class)
public class ProducerTest {//1.注入RabbitTemplate@Autowiredprivate RabbitTemplate rabbitTemplate;// @Test
// public void testSend(){
// rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_NAME,"boot.haha","hello 鼠鼠");
// }// @Test
// public void testSendMessage2() throws InterruptedException {
// String queue_Name= "simple.queue";
// String message="hello 鼠鼠";
//
// for(int i=1;i<=50;i++)
// rabbitTemplate.convertAndSend(queue_Name,message+i);
// Thread.sleep(20);
// }@Testpublic void testSendFanoutExchange(){//交换机名称String exchangeName="itcast.fanout";//消息String message="hello 鼠鼠";//发送消息rabbitTemplate.convertAndSend(exchangeName,"",message);}
}
Direct Exchange (注解实现)
案例
消费者代码
@Component
public class RabbitMQListener { @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name="itcast.direct" , type= ExchangeTypes.DIRECT),key={"red","blue"}))public void listenDirectQueue1(String msg){System.out.println("消费者接收到:"+msg);}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue2"),exchange = @Exchange(name="itcast.direct" , type= ExchangeTypes.DIRECT),key={"red","yellow"}))public void listenDirectQueue2(String msg){System.out.println("消费者接收到:"+msg);}
}
生产者代码
@Testpublic void testSendDirectExchange(){//交换机名称String exchangeName="itcast.direct";//消息String message="hello 鼠鼠";//发送消息rabbitTemplate.convertAndSend(exchangeName,"blue",message);}
此条代码只有绑定了blue这个key的队列才可以收到。
换成red就是两个队列都可以收到了。
Topic Exchange
案例
消费者代码
@RabbitListener(bindings = @QueueBinding(value=@Queue(name="topic.queue1"),exchange=@Exchange(name="itcast.topic",type = ExchangeTypes.TOPIC),key="japan.#"))public void listenTopicQueue1(String msg){System.out.println("消费者接收到:"+msg);}@RabbitListener(bindings = @QueueBinding(value=@Queue(name="topic.queue2"),exchange=@Exchange(name="itcast.topic",type = ExchangeTypes.TOPIC),key="#.news"))public void listenTopicQueue2(String msg){System.out.println("消费者接收到:"+msg);}
生产者代码
@Testpublic void testSendTopicExchange(){//交换机名称String exchangeName="itcast.topic";//消息String message="北岭山脚鼠鼠横死街头,究竟是人性的沦丧还是道德的....";//发送消息rabbitTemplate.convertAndSend(exchangeName,"japan.news",message);}
两个都符合,所以都能收到。
消息转换器
定义一个队列
@Beanpublic Queue objectQueue(){return new Queue("object.queue");}
生产者代码
@Testpublic void testSendObjectQueue(){//消息Map<String,Object> msg=new HashMap<>();msg.put("name","北岭山脚鼠鼠");msg.put("age","22");//发送消息rabbitTemplate.convertAndSend("object.queue",msg);}
可以看见消息被转换成了一长串字符,content_type写着java的序列化。
效率差,安全性也差。
JSON方式序列化
声明好MessageConveter之后就可以自动覆盖默认序列化方式了。
导入一个核心依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
生产者代码 (jackson)
修改生产者的启动类代码,加上一个Bean
@SpringBootApplication
public class ProducerApplication {public static void main(String[] args) {SpringApplication.run(ProducerApplication.class);}@Beanpublic Jackson2JsonMessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}
}
启动测试类之后可以看见新的消息出现了。
消费者代码(jackson)
然后可以正常接受到消息
如果消费者不使用对应jackson解析的话,代码会报错
总结
推荐使用jackson的方式
相关文章:
![](https://img-blog.csdnimg.cn/a09d9bf3cb10417a9e3742ab2f7ed448.png)
微服务——服务异步通讯RabbitMQ
前置文章 消息队列——RabbitMQ基本概念容器化部署和简单工作模式程序_北岭山脚鼠鼠的博客-CSDN博客 消息队列——rabbitmq的不同工作模式_北岭山脚鼠鼠的博客-CSDN博客 消息队列——spring和springboot整合rabbitmq_北岭山脚鼠鼠的博客-CSDN博客 目录 Work queues 工作队列…...
![](https://www.ngui.cc/images/no-images.jpg)
事件冒泡、事件捕获和事件委托
原文合集地址如下,有需要的朋友可以关注 本文地址 合集地址 什么是事件冒泡、事件捕获和事件委托? 事件冒泡(Event Bubbling)、事件捕获(Event Capturing)和事件委托(Event Delegation&…...
![](https://www.ngui.cc/images/no-images.jpg)
WEB 典型安全功能说明
WEB 典型安全功能 认证Authentication 认证是指通过验证用户的身份来确认用户是否有权访问某个系统或资源。在Web安全中,认证是非常重要的一环,它可以防止未经授权的访问,保护用户的数据和系统的安全。 登录 登录是用户认证的常见方式之一…...
![](https://img-blog.csdnimg.cn/f97993789cd445b18ac56f3f18a235c7.png)
SQL编译优化原理
最近在团队的OLAP引擎上做了一些SQL编译优化的工作,整理到了语雀上,也顺便发在博客上了。SQL编译优化理论并不复杂,只需要掌握一些关系代数的基础就比较好理解;比较困难的在于reorder算法部分。 文章目录 基础概念关系代数等价 j…...
![](https://www.ngui.cc/images/no-images.jpg)
qt signal slots lambda
这里用到了qt的版本检测 连接 Combox的currentIndexChanged事件 emit来触发处理的事件 ,进行业务或逻辑处理 这样的写法是lambda表达式的写法,和c#中的 (obj)>{ //todo } 类同 [](int indx){ //todo } #if QT_VERSION > QT_VERSION_CHECK(5,7,0)c…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring【声明式事务】
事务简介 把一组业务当成一个业务来做;要么都成功,要么都失败!事务在项目开发中,十分重要,涉及到数据一致性的问题,需要十分注意!确保完整性和一致性! 事务的ACID原则:…...
![](https://img-blog.csdnimg.cn/f2e34c9fba1242f69cd2c83ce5edb8b0.jpeg#pic_center)
【雕爷学编程】MicroPython动手做(17)——掌控板之触摸引脚2
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...
![](https://img-blog.csdnimg.cn/a2323da614824c9a9f3745ec180abd49.png)
pytorch 中 view 和reshape的区别
在 PyTorch(一个流行的深度学习框架)中, reshape 和 view 都是用于改变张量(tensor)形状的方法,但它们在实现方式和使用上有一些区别。下面是它们之间的主要区别: 实现方式: reshap…...
![](https://img-blog.csdnimg.cn/10e0091b2b044184bed46e5cde6be29d.png)
认识数组指针
文章目录 数组指针的定义数组指针的应用 数组指针的定义 类比 整形数组——存放整形的数组 指针数组——存放指针的数组 整形指针——存放整形地址的指针 数组指针——存放数组地址的指针 深度理解 在之前我们知道:数组名表示首元素地址,但是有…...
![](https://img-blog.csdnimg.cn/12aeef02c4ad4942bc18de15c98b1171.png)
SSM面试题-Spring容器的启动流程
解答: 1. BeanDefinitionReader读取配置文件(xml yml properties),创建BeanDefinition(存储bean的定义信息) 2. 配置文件读取成功后,将相应的配置转换成 BeanDefinition 的对象实例保存在DefaultListableBeanFactory#beanDefinitionMap 中 3. 根据配置的 BeanFacto…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue 3:玩一下web前端技术(八)
前言 本章内容为VUE基础与相关技术讨论。 上一篇文章地址: Vue 3:玩一下web前端技术(七)_Lion King的博客-CSDN博客 下一篇文章地址: (暂无) 一、基础 官方文档:创建一个 Vue…...
![](https://img-blog.csdnimg.cn/5a53961fd79449eb88ab58db9c684680.png)
AI绘画Stable Diffusion原理之Autoencoder-Latent
前言 传送门: stable diffusion:Git|论文 stable-diffusion-webui:Git Google Colab Notebook:Git kaggle Notebook:Git 今年AIGC实在是太火了,让人大呼许多职业即将消失,比如既能帮…...
![](https://www.ngui.cc/images/no-images.jpg)
C++核心知识点总结
学习一门新的程序设计语言得到最好方法就是练习编写程序! C基础 变量和基本类型 基本内置类型 定义解释 算术类型 整型:包括字符和布尔类型,bool、char、wchar_t、char16_t、char32_t、short、int、long、long long、 浮点型:…...
![](https://img-blog.csdnimg.cn/47723dbb3ed141c493ffe5241fcc9d31.png)
echart折线图,调节折线点和y轴的间距(亲测可用)
options代码: options {tooltip: {trigger: axis, //坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。},xAxis: {type: category,//类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。…...
![](https://img-blog.csdnimg.cn/8d606ca66f214e10bf2f76137f0fb55b.png)
Power BI-云端报表定时刷新--ODBC、MySQL、Oracle等其他本地数据源的刷新(二)
ODBC数据源 一些小众的数据源无法直接连接,需要通过微软系统自带的应用“ODBC数据源”连接。 1.首次使用应安装对应数据库的ODBC驱动程序,Mysql的ODBC驱动需要手动安装 2.在web服务中进行数据源的配置 Mysql数据源 1.Powerbi与Gateway第一次连SQL…...
![](https://img-blog.csdnimg.cn/382d7b29679a4f94b29f3efd554ca1d3.png)
redis 淘汰策略和持久化
文章目录 一、淘汰策略1.1 背景1.2 淘汰策略 二、持久化2.1 AOF日志2.1.1 AOF配置2.1.2 AOF策略2.1.3 AOF缺点2.1.4 AOF Rewrite2.1.5 AOF Rewrite配置2.1.6 AOF Rewrite缺点2.1.7 fork进程时的写时复制2.1.8 大key对持久化的影响 2.2 RDB快照2.2.1 RDB配置2.2.2 RDB缺点 2.3 混…...
![](https://img-blog.csdnimg.cn/8b136276acc746c9a86e892ce9a342c8.png)
Redis学习路线(6)—— Redis的分布式锁
一、分布式锁的模型 (一)悲观锁: 认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行。例如Synchronized、Lock都属于悲观锁。 优点: 简单粗暴缺点: 性能略低 &#x…...
![](https://img-blog.csdnimg.cn/1ad9c8f428b74149ba0598eff68b128d.png)
一、创建自己的docker python容器环境;支持新增python包并更新容器;离线打包、加载image
1、创建自己的docker python容器环境 参考:https://blog.csdn.net/weixin_42357472/article/details/118991485 首先写Dockfile,注意不要有txt等后缀 Dockfile # 使用 Python 3.9 镜像作为基础 FROM python:3.9# 设置工作目录 WORKDIR /app# 复制当前…...
![](https://img-blog.csdnimg.cn/7690936efee440d8a5eac2a0ca79481a.png)
【Git】git企业开发命令整理,以及注意点
1.git企业开发过程 业务的分支大概有以下几个: master:代码随时可能上线 develop:代码最新 feature/xxx:实际业务开发分支 release/xxx:预发布分支 fix:修复bug分支 过程大概是这样的: 首…...
![](https://img-blog.csdnimg.cn/1bfdd98645b14746b70d5252a8a8e7cb.png)
使用Django自带的后台管理系统进行数据库管理的实例
Django自带的后台管理系统主要用来对数据库进行操作和管理。它是Django框架的一个强大功能,可以让你快速创建一个管理界面,用于管理你的应用程序的数据模型。 使用Django后台管理系统,你可以轻松地进行以下操作: 数据库管理&…...
![](https://www.ngui.cc/images/no-images.jpg)
leetcode解题思路分析(一百四十五)1254 - 1266 题
统计封闭岛屿的数目 二维矩阵 grid 由 0 (土地)和 1 (水)组成。岛是由最大的4个方向连通的 0 组成的群,封闭岛是一个 完全 由1包围(左、上、右、下)的岛。请返回 封闭岛屿 的数目。 BFS或者DFS…...
![](https://www.ngui.cc/images/no-images.jpg)
使用 GORM 连接数据库并实现增删改查操作
步骤 1:安装 GORM 首先,我们需要安装 GORM 包。在终端中运行以下命令: shell go get -u gorm.io/gorm 步骤 2:导入所需的包 在 Go 代码的开头导入以下包: import ("gorm.io/driver/mysql" // 如果你使用…...
![](https://img-blog.csdnimg.cn/64cf217db05640b8b85db402e532f44e.png)
kafka集群搭建(Linux环境)
zookeeper搭建,可以搭建集群,也可以单机(本地学习,没必要搭建zookeeper集群,单机完全够用了,主要学习的是kafka) 1. 首先官网下载zookeeper:Apache ZooKeeper 2. 下载好之后上传到…...
![](https://img-blog.csdnimg.cn/img_convert/5a47d046d47b765e458f2e061711c7de.png)
树莓派本地快速搭建web服务器,并发布公网访问
文章目录 树莓派本地快速搭建web服务器,并发布公网访问 树莓派本地快速搭建web服务器,并发布公网访问 随着科技的发展,电子工业也在不断进步,我们身边的电子设备也在朝着小型化和多功能化演进,以往体积庞大的电脑也在…...
![](https://img-blog.csdnimg.cn/97ed5d35c49c430194f25f20e91a1d52.png)
集合中的数据结构
栈 先进后出入口跟出口在同一侧 队列 先进先出入口跟出口在不同的一层 数组 查询快、增删慢查询快是因为数组的地址是连续的,我们通过数组的首地址就可以找到数组,之后通过数组的下标就可以访问数组的每一个元素。增删慢是因为数组的长度是固定的&…...
![](https://img-blog.csdnimg.cn/82ec746e6de349db998beaa445673dfd.png)
CentOS 8 错误: Error setting up base repository
配置ip、掩码、网关、DNS VMware网关可通过如下查看 打开网络连接 配置镜像的地址 vault.centos.org/8.5.2111/BaseOS/x86_64/os/...
![](https://www.ngui.cc/images/no-images.jpg)
java外观模式
在Java中,外观模式(Facade Design Pattern)用于为复杂的子系统提供一个简单的接口,以方便客户端的使用。外观模式是一种结构型设计模式,它隐藏了系统的复杂性,将多个类的复杂操作封装在一个外观类中&#x…...
![](https://img-blog.csdnimg.cn/1ae80aa11c6043eba6f4efa2d11033eb.png)
3秒快速打开 jupyter notebook
利用 bat 脚本,实现一键打开 minconda 特点: 1、可指定 python 环境 2、可指定 jupyter 目录 一、配置环境 minconda 可以搭建不同的 python 环境,所以我们需要找到 minconda 安装目录,把对应目录添加到电脑环境 PATH 中&#…...
![](https://img-blog.csdnimg.cn/859defe710e940e2bb1372babac5295f.png)
数据安全
数据的备份与恢复 1. 数据备份技术 任何数据在长期使用过程中,都存在一定的安全隐患。由于认为操作失误或系统故障,例如认为错误、程序出错、计算机失效、灾难和偷窃,经常造成数据丢失,给个人和企业造成灾难性的影响。在这种情况…...
![](https://img-blog.csdnimg.cn/f40ae861f0e34843af4685ff55a5e482.png)
华为nat64配置
1.前期环境准备 环境拓扑 拓扑分为两个区域,左边为trust区域,使用IPv4地址互访,右边为untrust区域,使用IPv6地址互访 2.接口地址配置 pc1地址配置 pc2地址配置 FW接口配置 (1)首先进入防火墙配置界面 注:防火墙初始账号密码为user:admin,pwd:Admin@123,进入之后…...
![](http://f.hiphotos.baidu.com/exp/w=500/sign=fa57447d0a46f21fc9345e53c6256b31/0dd7912397dda14480a96634b2b7d0a20df48697.jpg)
江苏连云港做网站/在线代理浏览网址
系统盘里带着那个啊具体步骤。。1运行GHOST,进入GHOST主页面 2在主页面单击OK按钮后依次执行Local\Partition\To lmage,命令 3接下来选择硬盘.用户装了几个硬盘,则此处就会出现几个选项. 4接下来,选择硬盘中的分区.选择需要的分区后,单击OK进入下一个步骤 5选择存放的地址和文件…...
![](/images/no-images.jpg)
深圳有做网站的公司660元/安康seo
快捷键:Ctrld:快速复制 Ctrl/:注释 ShiftEnter:直接跳转下一行注释: """多行注释多行注释多行注释"""# 单行注释# print(hello world)# print(hello world)# 这是一行。。。。代码print(hello…...
![](/images/no-images.jpg)
做第一个php网站/热狗seo顾问
周次 学习时间 新编写代码行数 博客量(篇) 学到知识点 本周 5 80(HTML的不知道算不算) 1 JAVA基础,网络基础的静态路由配置, XX XXX XXXX XXXX 转载于:https://www…...
![](/images/no-images.jpg)
网站首页文案模板/站长网站查询
事情又回到了JS的回收机制上。当一个人被忘记的时候,在某种意义上,这个人就消失了。JS的变量也是如此,当没有东西引用它的时候它就消失了。而它的存在亦是如此。 对于持续运行的服务进程(daemon),必须及时释…...
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
html与css结合网站开发书籍/网站推广的6个方法是什么
上一篇文章 "无侵入方面编程-用HttpModuleSoapExtension监视页面执行参数(一)"中,我们实现了监视每个页面的执行情况和调用WebService的简单信息。 这次我们继续深入一下SoapExtension的应用,在不改变Soap的WSDL文档的情况下&#…...
![](https://s1.51cto.com/attachment/201312/120103677.png)
如何做网站导航栏/网络营销案例ppt
很多时候,新机器批量部署可以使用kickstart、cobbler等来批量部署,但如果想重装linux呢,这两个工具能不能做到,我不太清楚,我做不了,于是可以考虑使用sshvnc来实现远程重装linux系统,就像我们在…...