SpringBoot3整合RabbitMQ之三_工作队列模型案例

SpringBoot3整合RabbitMQ之三_工作队列模型案例

文章目录

  • SpringBoot3整合RabbitMQ之三_工作队列模型案例
  • 2. 工作队列模型
    • 1. 消息发布者
      • 1. 创建工作队列的配置类
      • 2. 发布消费Controller
    • 2. 消息消费者One
    • 3. 消息消费者Two
    • 4. 消息消费者Three
    • 5. 输出结果

2. 工作队列模型

在这里插入图片描述

1. 消息发布者

1. 创建工作队列的配置类

package com.happy.msg.config;import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** <p>** @Description: 工作队列模型_创建名称为 work_queue 的队列 <br>* </p>* @Datetime: 2024/3/27 18:18* @Author: Yuan · JinSheng <br>* @Since 2024/3/27 18:18*/
@Configuration
public class WorkQueueConfig {@BeanQueue workQueue() {return QueueBuilder.durable("work_queue").build();}
}

2. 发布消费Controller

package com.happy.msg.publisher;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;/*** <p>** @Description: 生产消息的控制器 <br>* </p>* @Datetime: 2024/3/27 10:53* @Author: Yuan · JinSheng <br>* @Since 2024/3/27 10:53*/
@RestController
@RequestMapping("/work")
public class WorkQueuePublisherController {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/send")public String sentMessage() {for (int i = 1; i <=10 ; i++) {rabbitTemplate.convertAndSend("work_queue", "work_queue队列第["+i+"]条消息,hello,rabbitmq"+i);}return "发送成功";}
}

2. 消息消费者One

package com.happy.msg.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
/*** <p>* @Description: 工作队列模型_消息消费者一 <br>* </p>* @Datetime: 2024/3/28 20:28* @Author: Yuan · JinSheng <br>* @Since 2024/3/28 20:28*/
@Slf4j
@Component
public class WorkQueueConsumerOne {/**** @param message 消息* @Description: 监听work_queue队列中的消息,当客户端启动后,work_queue队列中的所有的消息都被此消费者消费并打印* @Author: Yuan · JinSheng*/@RabbitListener(queues = "work_queue")public void msg(Message message){byte[] messageBody = message.getBody();String msg = new String(messageBody);log.info("WorkQueueConsumerOne接收到work_queue队列中的消息==={},===接收时间==={}",msg, LocalDateTime.now());}
}
  1. 输出结果
WorkQueueConsumerOne接收到work_queue队列中的消息===work_queue队列第[1]条消息,hello,rabbitmq1,===接收时间===2024-03-29T10:34:34.468074100
WorkQueueConsumerOne接收到work_queue队列中的消息===work_queue队列第[3]条消息,hello,rabbitmq3,===接收时间===2024-03-29T10:34:34.469081600
WorkQueueConsumerOne接收到work_queue队列中的消息===work_queue队列第[5]条消息,hello,rabbitmq5,===接收时间===2024-03-29T10:34:34.469976
WorkQueueConsumerOne接收到work_queue队列中的消息===work_queue队列第[7]条消息,hello,rabbitmq7,===接收时间===2024-03-29T10:34:34.469976
WorkQueueConsumerOne接收到work_queue队列中的消息===work_queue队列第[9]条消息,hello,rabbitmq9,===接收时间===2024-03-29T10:34:34.470811800

3. 消息消费者Two

package com.happy.msg.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
/*** <p>* @Description: 工作队列模型_消息消费者二<br>* </p>* @Datetime: 2024/3/28 20:30* @Author: Yuan · JinSheng <br>* @Since 2024/3/28 20:30*/
@Slf4j
@Component
public class WorkQueueConsumerTwo {/**** @param message 消息* @Description: 监听work_queue队列中的消息,当客户端启动后,work_queue队列中的所有的消息都被此消费者消费并打印* @Author: Yuan · JinSheng*/@RabbitListener(queues = "work_queue")public void msg(Message message){byte[] messageBody = message.getBody();String msg = new String(messageBody);log.info("WorkQueueConsumerTwo接收到work_queue队列中的消息==={},===接收时间==={}",msg, LocalDateTime.now());}
}

4. 消息消费者Three

package com.happy.msg.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
/*** <p>* @Description: 工作队列模型_消息消费者三<br>* </p>* @Datetime: 2024/3/28 20:30* @Author: Yuan · JinSheng <br>* @Since 2024/3/28 20:30*/
@Slf4j
@Component
public class WorkQueueConsumerTwo {/**** @param message 消息* @Description: 监听work_queue队列中的消息,当客户端启动后,work_queue队列中的所有的消息都被此消费者消费并打印* @Author: Yuan · JinSheng*/@RabbitListener(queues = "work_queue")public void msg(Message message){byte[] messageBody = message.getBody();String msg = new String(messageBody);//log.info("WorkQueueConsumerTwo接收到work_queue队列中的消息==={},===接收时间==={}",msg, LocalDateTime.now());System.out.println("WorkQueueConsumerTwo接收到work_queue队列中的消息==="+msg+",===接收时间==="+LocalDateTime.now());}
}

5. 输出结果

可看到消息被三个消费者按相等数量消费,总共10条消息,消费者1消费了4条,其他两个消费者消费了3条消息

WorkQueueConsumerTwo接收到work_queue队列中的消息===work_queue队列第[3]条消息,hello,rabbitmq3,===接收时间===2024-03-29T10:39:32.942546200
WorkQueueConsumerThree接收到work_queue队列中的消息===work_queue队列第[2]条消息,hello,rabbitmq2,===接收时间===2024-03-29T10:39:32.942546200
WorkQueueConsumerOne接收到work_queue队列中的消息===work_queue队列第[1]条消息,hello,rabbitmq1,===接收时间===2024-03-29T10:39:32.942037700
WorkQueueConsumerTwo接收到work_queue队列中的消息===work_queue队列第[6]条消息,hello,rabbitmq6,===接收时间===2024-03-29T10:39:32.943806300
WorkQueueConsumerOne接收到work_queue队列中的消息===work_queue队列第[4]条消息,hello,rabbitmq4,===接收时间===2024-03-29T10:39:32.944336900
WorkQueueConsumerTwo接收到work_queue队列中的消息===work_queue队列第[9]条消息,hello,rabbitmq9,===接收时间===2024-03-29T10:39:32.944336900
WorkQueueConsumerThree接收到work_queue队列中的消息===work_queue队列第[5]条消息,hello,rabbitmq5,===接收时间===2024-03-29T10:39:32.944336900
WorkQueueConsumerOne接收到work_queue队列中的消息===work_queue队列第[7]条消息,hello,rabbitmq7,===接收时间===2024-03-29T10:39:32.944336900
WorkQueueConsumerOne接收到work_queue队列中的消息===work_queue队列第[10]条消息,hello,rabbitmq10,===接收时间===2024-03-29T10:39:32.944336900
WorkQueueConsumerThree接收到work_queue队列中的消息===work_queue队列第[8]条消息,hello,rabbitmq8,===接收时间===2024-03-29T10:39:32.944336900

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SGD随机梯度下降

一、补充概念&#xff1a; 目标函数&#xff08;Objective Function&#xff09;&#xff1a;这个术语通常指的是整个优化问题中需要最小化&#xff08;或最大化&#xff09;的函数。在机器学习和优化中&#xff0c;目标函数可以包括损失函数以及正则化项等。目标函数的最优化过…

怎么转换图片格式jpg?分享几种转换的方法

我们都知道现在图片格式种类非常多&#xff0c;比较常用的有jpg、png、webp等&#xff0c;很多时候&#xff0c;我们在网上保存的照片不是jpg格式的&#xff0c;查看或者编辑起来就很麻烦&#xff0c;这时候你可能需要将图片转换成jpg格式&#xff0c;那怎么转换图片格式jpg呢?…

【CNN】ConvMixer探究ViT的Patch Embedding: Patches Are All You Need?

Patches Are All You Need? 探究Patch Embedding在ViT上的作用&#xff0c;CNN是否可用该操作提升性能&#xff1f; 论文链接&#xff1a;https://openreview.net/pdf?idTVHS5Y4dNvM 代码链接&#xff1a;https://github.com/tmp-iclr/convmixer 1、摘要 ViT的性能是由于T…

我的 256天 创作纪念日

创作纪念日 我与CSDN的初识耕耘后的收获有笑有泪的日常小小的成就我的憧憬 我与CSDN的初识 在大一上学期的C语言课程中&#xff0c;我首次接触到CSDN。那时&#xff0c;面对众多难以理解的题目&#xff0c;我不得不频繁搜索相关知识和题解&#xff0c;CSDN成了我的救星。这个经…

这几个小众SaaS知识库工具原来这么好用,强烈推荐!

时代的进步和科技的发展&#xff0c;让我们有了更多高效的工作工具。由于云计算和SaaS&#xff08;Software as a Service&#xff09;的普及&#xff0c;越来越多的知识库工具被广大用户所知和使用。今天&#xff0c;就让我来为你推荐几款小众但卓效独特的SaaS知识库工具。 首…

市场首款!华邦电子发布内置PQC算法的闪存产品

3月27日&#xff0c;全球领先的半导体内存解决方案供应商华邦电子股份有限公司推出TrustME Secure Flash W77Q系列的最新扩展&#xff0c;包括256Mb、512Mb和1Gb器件。 这些突破性的安全闪存设备是市场上首款针对后量子密码学&#xff08;PQC&#xff09;实施Leighton-Micali签…

FSP7罗德与施瓦茨FSP7频谱分析仪

181/2461/8938产品概述&#xff1a; 罗德与施瓦茨 FSP7 频谱分析仪以其创新的测量和大量标准功能而著称。FSP7 没有提供多种选项&#xff0c;而是标配了最先进的频谱分析仪所需的所有功能和接口。FSP 具有如此丰富的功能&#xff0c;以极具吸引力的性价比提供最先进的频谱分析…

windows下Msys2编译OpenOCD方法与总结

windows下Msys2编译OpenOCD方法与总结 参考博客&#xff1a; 编译的总体方法&#xff1a;https://blog.csdn.net/MicroMehhh/article/details/135721360lib-usb库问题的解决办法&#xff1a;https://github.com/espressif/openocd-esp32/issues/162编译方法参考&#xff1a; …

智过网:一建继续教育,操作指南与周期解析

随着社会的快速发展和技术的不断更新&#xff0c;建筑行业对从业人员的专业素质要求也在逐步提高。为了确保一级建造师的专业技能能够与时俱进&#xff0c;满足行业发展的需求&#xff0c;继续教育成为了必不可少的环节。本文将详细解析一建继续教育的操作流程及其周期安排&…

前端开发学习笔记 3 (Chrome浏览器调试工具、Emmet语法、CSS复合选择器、CSS元素选择模式、CSS背景)

文章目录 Chrome浏览器调试工具Emmet语法CSS复合选择器后代选择器子选择器并集选择器伪类选择器 CSS元素选择模式元素选择模式概述CSS块标签CSS行内标签CSS行内块标签CSS元素显示模式转换 CSS背景CSS背景颜色CSS背景图片CSS背景图片平铺CSS背景图片位置CSS背景图片固定CSS背景复…

解锁网络安全新境界:雷池WAF社区版让网站防护变得轻而易举!

网站运营者的救星&#xff1a;雷池WAF社区版 ️ 嘿朋友们&#xff01;今天我超级激动要跟你们分享一个神器——雷池WAF社区版。这个宝贝对我们这帮网站运营者来说&#xff0c;简直就是保护伞&#xff01; 智能语义分析技术&#xff1a;超级侦探上线 先说说为啥我这么稀饭它。雷…

10倍提效!用ChatGPT编写系统功能文档。。。

系统功能文档是一种描述软件系统功能和操作方式的文档。它让开发团队、测试人员、项目管理者、客户和最终用户对系统行为有清晰、全面的了解。 通过ChatGPT&#xff0c;我们能让编写系统功能文档的效率提升10倍以上。 ​《Leetcode算法刷题宝典》一位阿里P8大佬总结的刷题笔记…

TCP挥手中TIME_WAIT存在的原因

四次挥手的一般过程如图所示&#xff1a; 在客户端收到FIN结束报文的时候不是立刻进入CLOSED状态&#xff0c;而是进入TIME_WAIT状态&#xff0c;一般等2MLS后进入关闭状态。 原因&#xff1a; 1.可靠地终止 TCP 连接。 2.保证让迟来的 TCP报文段有足够的时间被识别并丢弃。 …

长文本大模型火爆国内AI市场,算力需求激增引领行业变革

近期&#xff0c;一款名为Kimi的大模型火爆国内AI市场&#xff0c;以其出色的长文本处理能力和广泛的应用前景吸引了众多关注。随着Kimi等长文本大模型的流行&#xff0c;算力需求持续增长&#xff0c;为AI行业带来了新的变革和机遇。 Kimi突破长文本处理极限&#xff0c;为复杂…

Leetcode-Hot 100题目分类

哈希 &#xff08;以空间换时间&#xff09; 1 两数之和 原始的暴力破解的方法&#xff1a; class Solution {public int[] twoSum(int[] nums, int target) {/** 暴力破解的方法 */int[] result new int[2];int length nums.length;for(int i 0;i<length;i){for(int j…

win10鼠标无限转圈圈是什么原因,win10系统鼠标无限转圈圈

win10鼠标无限转圈圈是什么原因?一般后台有程序在运行,鼠标出现圆圈转动则代表正在加载中,等待一会就好了。若如果转了好久的圈圈,程序没有响应,点击桌面也没有反应,则尝试打开任务管理器,将未响应或异常的程序强制结束掉。其实,出现这种情况,有可能是win10系统中的一…

【氮化镓】GaN SP-HEMT的栅极可靠性

概括总结&#xff1a; 本文研究了氮化镓&#xff08;GaN&#xff09;肖特基型p-栅高电子迁移率晶体管&#xff08;GaN SP-HEMT&#xff09;的栅极鲁棒性和可靠性&#xff0c;通过一种新的电路方法评估了在实际转换器中栅极电压&#xff08;VGS&#xff09;过冲波形的栅极电压应…

第四百四十二回 再谈flutter_launcher_icons包

文章目录 1. 概念介绍2. 使用方法3. 示例代码4. 经验与总结4.1 经验分享4.2 内容总结 我们在上一章回中介绍了"overlay_tooltip简介"相关的内容&#xff0c;本章回中将 再谈flutter_launcher_icons包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 …

dockerhub右键快速搜索脚本

Chrome 浏览器扩展的后台脚本&#xff0c;用于创建右键菜单项&#xff0c;并根据用户的操作在新的标签页中打开 Docker Hub 网站或者进行搜索。 // 创建右键菜单项&#xff0c;用于打开 Docker Hub 网站 chrome.contextMenus.create({id: search-home, // 菜单项的唯一标识符t…

吴恩达2022机器学习专项课程(一) 4.6 运行梯度下降第一周课程实验:线性回归的梯度下降算法

问题预览/关键词 更新梯度下降对模型拟合&#xff0c;等高线图&#xff0c;3d空间图的变化。什么是批量梯度下降。实验目标计算梯度运行梯度下降梯度下降迭代次数和成本函数的关系可视化模型预测在等高线图上的梯度下降学习率过大报错问题 笔记 1.模型拟合&#xff0c;等高线…