山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十八)- 微服务(8)
目录
11.4 SpringAMQP
11.4.2 Work Queue工作队列
11.4.3 发布订阅模型
11.4.4 FanoutExchange(广播交换机)
11.4.5 DirectExchange(路由模式交换机)
11.4.6 TopicExchange
11.5 消息转换器
11.4 SpringAMQP

父工程引入AMQP依赖
<!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
编写测试方法
yml配置文件中编写配置
spring:rabbitmq:host: 192.168.142.130 # rabbitmq的ip地址port: 5672 # 端口username: xxxxxpassword: xxxxxxxvirtual-host: /
发消息测试
@SpringBootTestpublic class AMQPTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testSendMessage2SimpleQueue(){String queueName = "simple.queue";String message = "hello,spring amqp";rabbitTemplate.convertAndSend(queueName,message);}}

在consumer中编写消费逻辑,监听simple.queue
配置文件配置 :
spring:rabbitmq:host: 192.168.142.129 # rabbitmq的ip地址port: 5672 # 端口username: xxxxxpassword: xxxxxvirtual-host: /
编写监听类
@Componentpublic class SpringRabbitListener {@RabbitListener(queues = "simple.queue")public void ListenSimpleQueue(String msg){System.out.println("消费者接收到simple.queue的消息 : " + msg);}}
启动主启动类,控制台可看到输出的监听到的消息
消息一旦被消费,就会从队列中删除,没有回收机制
11.4.2 Work Queue工作队列


publisher代码
@Testpublic void testSendMessage2WorkQueue() throws InterruptedException {String queueName = "simple.queue";String message = "hello,spring amqp__";for(int i = 1 ; i <= 50 ; i ++){rabbitTemplate.convertAndSend(queueName,message + i); Thread.sleep(20);}}
consumer接收消息
// 消费者1@RabbitListener(queues = "simple.queue")public void ListenWork1Queue(String msg) throws InterruptedException {System.out.println("消费者1接收到simple.queue的消息 : " + msg + LocalTime.now());Thread.sleep(20);}// 消费者2@RabbitListener(queues = "simple.queue")public void ListenWork2Queue(String msg) throws InterruptedException {System.err.println("消费者2接收到simple.queue的消息 : " + msg + LocalTime.now());Thread.sleep(200);}
消息预取机制使得两者平均分配消息 不符预期
配置文件中 :
处理预取值
spring:rabbitmq:host: 192.168.142.129 # rabbitmq的ip地址port: 5672 # 端口username: xxxxxxpassword: xxxxxxxvirtual-host: /listener:simple:prefetch: 1 # 每次只能获取一条消息 ,处理完成才能获取下一个信息

11.4.3 发布订阅模型

11.4.4 FanoutExchange(广播交换机)

步骤一 : 声明交换机,队列 , 并绑定队列和交换机
在consumer中编写配置类
@Configurationpublic class FanoutConfig {// 声明交换机@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("xinbo.fanout");}// 声明队列1@Beanpublic Queue fanoutQueue1(){return new Queue("fanout.queue1");}// 绑定队列1到交换机@Beanpublic Binding fanoutBindind(Queue fanoutQueue1,FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}// 声明队列2@Beanpublic Queue fanoutQueue2(){return new Queue("fanout.queue2");}// 绑定队列2到交换机@Beanpublic Binding fanoutBindind2(Queue fanoutQueue2,FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}}
消息监听 :
@Componentpublic class SpringRabbitListener {// 消费者1@RabbitListener(queues = "fanout.queue1")public void ListenWork1Queue(String msg) throws InterruptedException {System.out.println("消费者1接收到fanout.queue1的消息 : " + msg + LocalTime.now());Thread.sleep(20);}// 消费者2@RabbitListener(queues = "fanout.queue2")public void ListenWork2Queue(String msg) throws InterruptedException {System.err.println("消费者2接收到fanout.queue2的消息 : " + msg + LocalTime.now());Thread.sleep(200);}}
消息发送 :
@Testpublic void testSendFanoutExchange(){String exchangeName = "xinbo.fanout"; // 交换机名称String message = "hello,everyone";rabbitTemplate.convertAndSend(exchangeName,null,message);}
11.4.5 DirectExchange(路由模式交换机)

利用@RabbitListener声明Exchange Queue RoutingKey
SpirngRabbitListener中
@Componentpublic class SpringRabbitListener {@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name = "xinbo.direct",type = ExchangeTypes.DIRECT),key = {"red","blue"}))public void ListenDirectQueue1(String msg) throws InterruptedException {System.out.println("消费者接收到direct.queue1的消息 : " + msg + LocalTime.now());Thread.sleep(20);}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue2"),exchange = @Exchange(name = "xinbo.direct",type = ExchangeTypes.DIRECT),key = {"red","yellow"}))public void ListenDirectQueue2(String msg) throws InterruptedException {System.out.println("消费者接收到direct.queue2的消息 : " + msg + LocalTime.now());Thread.sleep(20);}}
发送消息测试 :
@Testpublic void testSendDirectExchange(){// 交换机名称String exchangeName = "xinbo.direct";String message = "hello,blue";rabbitTemplate.convertAndSend(exchangeName,"blue",message);}
11.4.6 TopicExchange

绑定队列和交换机的关系 :
@Componentpublic class SpringRabbitListener {@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue1"),exchange = @Exchange(name="xinbo.topic",type = ExchangeTypes.TOPIC),key = "china.#"))public void ListenTopicQueue1(String msg){System.out.println("消费者接收到topic.queue1的消息 : " + msg + LocalTime.now());}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue2"),exchange = @Exchange(name="xinbo.topic",type = ExchangeTypes.TOPIC),key = "#.news"))public void ListenTopicQueue2(String msg){System.out.println("消费者接收到topic.queue2的消息 : " + msg + LocalTime.now());}}
发送消息 :
@Testpublic void testSendTopicExchange(){// 交换机名称String exchangeName = "xinbo.topic";String message = "中国发生了xxxxx";rabbitTemplate.convertAndSend(exchangeName,"china.news",message);}
11.5 消息转换器
发送和接受json类型的消息
添加依赖 :
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId></dependency>
在配置类中
@Beanpublic MessageConverter messageCondition(){return new Jackson2JsonMessageConverter();}
接收消息 :
引依赖 :同上
在Listener中 :
@RabbitListener(queues = "object.queue")public void ListenObjectQueue(Map<String,Object> msg){System.out.println(msg);}
相关文章:
山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十八)- 微服务(8)
目录 11.4 SpringAMQP 11.4.2 Work Queue工作队列 11.4.3 发布订阅模型 11.4.4 FanoutExchange(广播交换机) 11.4.5 DirectExchange(路由模式交换机) 11.4.6 TopicExchange 11.5 消息转换器 11.4 SpringAMQP 父工程引入AMQP依赖 <!--AMQP依赖,包含RabbitMQ…...
如何将 MySQL 数据库共享给他人?
文章目录 共享所有数据库给他人1. 连接到 MySQL 数据库2. 选择要使用的数据库3. 修改连接所需的 host4. 刷新权限 共享部分数据库给他人1. 创建用户2. 授权3. 刷新权限 结语 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是I…...
netty-学习
Netty Netty 的核心概念Netty 的主要特性Netty 的应用场景Netty 的基本使用服务器端处理器 总结 代码分析1.心跳检测代码解析类和成员变量userEventTriggered方法总结 4.参数详解ChannelHandlerContext ctxObject evt 事件来源示例:配置 IdleStateHandler事件处理示…...
无线和移动网络
背景 两个重要的挑战 无线:通过无线链路通信移动:需要网络处理移动(不同变换所接入的网络)用户 无线网络中的组件 无线主机(无线并不总是意味着移动的)基站(base station 或者叫AP࿰…...
快团团账号被封,大团长帮卖团长如何避免违规操作
去年末到现在有部分小伙伴反馈,自己的快团团账号资金提现受到限制,也有个别的快团团大团长账号直接被查封了,有些团长是明知是违规行为还抱有侥幸的心理,比如有个做房产中间的小伙,知道套现违规还频频套现,…...
Github Copilot登录账号,完美支持chat
Github Copilot 代码补全等功能,提高写代码的效率 https://web.52shizhan.cn/activity/copilot 登录授权后,已经可以使用,完美。如图...
Ubuntu系统中Apache Web服务器的配置与实战
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
如何在路由器上安装代理服务:详细教程
如何在路由器上安装代理服务:详细教程 步骤一:通过漏洞进入路由器系统开启Telnet服务使用Telnet登录路由器系统查看系统信息和CPU信息步骤二:交叉编译MIPS程序 Go对MIPS的支持 安装TFTP Server使用BusyBox tftp传输文件在路由器系统中下载编译…...
JavaScript html css前端 日期对象 date对象 日期格式化 时间戳
日期对象 Date对象 Date 对象和 Math 对象不一样,他是一个构造函数,所以我们需要实例化后才能使用 Date 实例用来处理日期和时间 Date()使用方法 示例:获取当前时间 let now new Date() console.log(now) 示例:获取指定时间…...
【再探】设计模式—备忘录模式与解释器模式
备忘录模式是用于保存对象在某个时刻的状态,来实现撤销操作。而解释器模式则是将文本按照定义的文法规则解析成对应的命令。 1 备忘录模式 需求:保存对象在某个时刻的状态,后面可以对该对象实行撤销操作。 1.1 备忘录模式介绍 提供一种状…...
SpringCloud网关-gateway
一 什么是网关?为什么选择 Gateway? 网关功能如下: 身份认证和权限校验服务路由、负载均衡请求限流 在 Spring Cloud 中网关的实现包含两种: Gateway(推荐):是基于 Spring5 中提供的 WebFlux ÿ…...
LiveData是如何感知Room数据变化的
一 Room数据变化LiveData如何收到onChanged回调的? 1.1 LiveData是如何创建的 这里讨论的LiveData的创建是特指Dao定义的方法的返回类型,而不是所有的LiveData。 以NoteDao 举例: Dao public interface NoteDao {Query("select * fr…...
【自动化】WebUI自动化通过读取用户数据的方式启动浏览器实现绕过相关登录验证的方法。
背景说明 我相信做自动化测试或者实现UI自动化相关功能的同学肯定碰到过,每次写好脚本执行时都是默认打开一个 “新”的浏览器,我的意思是就跟刚下载的浏览器一样。而不是平时日常使用着的浏览器的状态,日常使用浏览器时只要近期登录过&…...
信号:干扰类别及特征提取
目录 第一部分:干扰类别 1.压制干扰 1.1噪声调幅瞄准式干扰(单音干扰) 1.2噪声调频阻塞式干扰(宽带噪声干扰) 1.3噪声调频扫频式干扰(线性调频) 2.欺骗干扰 2.1距离欺骗干扰(幅度调制干扰࿰…...
【推荐】用scss循环zoom缩放比例,解决可视化大屏在不同分辨率屏幕下的适配问题
方法1: 指定几种常规屏幕宽度(用这种方式就必须要强制用户全屏查看页面,在固定的宽度下才能达到比较不错的显示效果) // 适配不同分辨率的页面---------------------------------------- html {overflow: hidden;width: 1920px;…...
23中设计模式之一— — — —命令模式的详细介绍
命令模式 Command Pattern讲解 概念描述模式结构主要角色模式的UIM类图模式优点模式缺点应用场景实例演示类图代码演示运行结果 概念 命令模式(别名:动作,事务) 命令模式是一种行为设计模式,将一个请求封装为一个对象…...
解决 Mac Django 连接Mysql 出现 image not found 问题
最近在使用 Django 框架,因为升级到4.2版本了,对应的本机 Mysql 5.7 就不适用了,于是升级到了 Mysql 8.0,写好代码之后出现如下错误: 仔细分析一下错误的描述: ImportError: dlopen(/Library/Frameworks/P…...
EitbaseEX香港业务开展,提升用户友好交易体验
在全球范围内备受瞩目的加密货币交易平台Coinbase,宣布正式入驻香港市场,并命名为EitbaseEX。这一战略性扩展举措,旨在为香港提供先进的加密货币交易技术和服务,同时将香港打造为其在亚太地区的重要枢纽。 作为国际金融中心&#…...
ROS学习记录:自定义消息类型
前言 当我们需要传输一些特殊的数据时,且官方的消息包无法满足需求,我们便可以自己定义一个消息类型。 实验步骤 一、在终端输入cd ~/catkin_ws1/src进入工作空间中src目录 二、输入catkin_create_pkg qq_msgs roscpp rospy std_msgs message_generati…...
创新实训2024.06.06日志:部署web服务
1. 运行web项目前后端服务 首先我们要先在服务器上运行客户端以及服务端的应用程序。随后再考虑如何通过公网/局域网访问的问题。 如何启动服务在仓库对应分支下的Readme文件中已经有详细描述了。 1.1. 启动服务端 对于服务端,即(要求你在服务端子项…...
3个技巧让你轻松获取Steam创意工坊资源:WorkshopDL的跨平台下载解决方案
3个技巧让你轻松获取Steam创意工坊资源:WorkshopDL的跨平台下载解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 在游戏模组爱好者的日常中,总会…...
Llama-3.2V-11B-cot效果展示:模型对‘正常但可疑’图像模式的异常检测能力
Llama-3.2V-11B-cot效果展示:模型对正常但可疑图像模式的异常检测能力 1. 模型能力概览 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专门针对双卡4090环境进行了深度优化。该模型具备以下核心能力…...
Python➕PyQt5➕numpy➕pandas实现学生成绩分析系统(可视化)基于 Python + PyQt5 + Matplotlib + Pandas 实现的学生成绩分析系统框架
基于 Python PyQt5 Matplotlib Pandas 实现的学生成绩分析系统框架 Python➕PyQt5➕numpy➕pandas实现学生成绩分析系统(可视化) (源码项目文档详细README) !!代码注释非常详细 !!…...
OpenClaw备份方案:Qwen2.5-VL-7B技能与配置的定期同步
OpenClaw备份方案:Qwen2.5-VL-7B技能与配置的定期同步 1. 为什么需要备份OpenClaw系统 上周我的开发机突然蓝屏,硬盘分区表损坏。当我重装系统后,发现过去三个月精心调教的OpenClaw配置全部丢失——包括调试好的技能参数、对接的飞书机器人…...
第 6 次执行后,PostgreSQL 执行计划为何突变?
引言 在 PostgreSQL 中,预处理语句通常用于提升性能并防止 SQL 注入。但一个不易察觉的行为是:查询规划器会在执行达到特定次数后自动改变执行计划。 这种变化往往令人困惑——SQL 本身未发生变化,执行计划却突然发生切换,有时甚至…...
拯救受损二维码:用QRazyBox实现高效恢复的4个实战策略
拯救受损二维码:用QRazyBox实现高效恢复的4个实战策略 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox QRazyBox是一款专业的二维码分析与恢复工具包(QR Code Analysis …...
Cisco Packet Tracer实战:从零搭建一个带冗余和ACL策略的企业网络(附完整配置命令)
Cisco Packet Tracer企业网络实战:冗余架构与ACL策略深度解析 第一次在Packet Tracer中搭建完整企业网络时,我被VLAN间通信、HSRP热备切换和ACL策略的连锁反应彻底难住了。记得那个深夜,当错误配置的ACL导致整个财务部门网络瘫痪时࿰…...
博士论文的“破茧”时刻:好写作AI如何陪你走完最后一公里
一个论文科普博主眼中的“学术极限运动辅助器” 亲爱的博士生朋友们,今天我们聊点“不轻松”的话题。 当你的同学在朋友圈晒工作、晒娃、晒旅游时,你在晒什么?晒图书馆的凌晨三点,晒被导师批注得“血肉模糊”的草稿,晒…...
从package.xml到CMakeLists.txt:手把手教你配置一个ROS1机器人控制包(附完整项目模板)
从package.xml到CMakeLists.txt:构建工业级ROS1机器人控制包的完整指南 在机器人操作系统(ROS)开发中,功能包的配置质量直接影响项目的可维护性和扩展性。本文将带您深入理解ROS1功能包的核心配置文件,通过一个完整的工业机器人控制包案例&am…...
项目介绍 MATLAB实现基于概率路图法(PRM)进行无人机三维路径规划的详细项目实例(含模型描述及部分示例代码) 专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持
MATLAB实现基于概率路图法(PRM)进行无人机三维路径规划的详细项目实例 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解) 随着无人机技术的快速发展&…...
