RabbitMQ系列学习笔记(三)--工作队列模式

文章目录

  • 一、工作队列模式原理
  • 二、工作队列模式实战
    • 1、抽取工具类
    • 2、消费者代码
    • 3、生产者代码
    • 4、查看运行结果

本文参考
尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq
RabbitMQ 详解
Centos7环境安装Erlang、RabbitMQ详细过程(配图)

一、工作队列模式原理

image.png
与简单模式相比,工作队列模式(Work Queue)多了一些消费者,该模式也是使用 direct 交换机,应用于处理消息较多的情况,对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度
工作队列模式实际上是一种竞争关系的模式,多个消费者之间是竞争关系,即一条消息如果被某个消费者消费了,那么其他的消费者就获取不到了。特点如下:

  • 一个队列对应多个消费者。
  • 一条消息只会被一个消费者消费。
  • 消息队列默认采用 轮询 的方式将消息平均发送给消费者。

二、工作队列模式实战

1、抽取工具类

通过前边简单模式的实践发现,其实无论是生产者还是消费者,在代码实现中是有共通点的,我们可以将前期建立连接获取信道的代码片段抽取出来,形成一个工具类。

public class RabbitMqUtil {//得到一个连接的 channelpublic static Channel getChannel() throws Exception {//创建一个连接工厂并建立连接 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("192.168.222.139"); factory.setUsername("admin"); factory.setPassword("scr1pt_yang.");Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); return channel;}
}

2、消费者代码

工作队列模式的消费者与简单模式的消费者代码实现上没有区别,只是消费者数量增加了。

/*** Description: 工作队列模式消费者01*/
public class Consumer01 {//队列名称private static final String QUEUE_NAME = "work_queue";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtil.getChannel();// 创建队列channel.queueDeclare(QUEUE_NAME, true, false, false, null);System.out.println("C1等待接收消息.....");channel.basicConsume(QUEUE_NAME, true, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("接收到消息: " + message);}});}
}
/*** Description: 工作队列模式消费者02*/
public class Consumer01 {//队列名称private static final String QUEUE_NAME = "work_queue";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtil.getChannel();System.out.println("C2等待接收消息.....");channel.basicConsume(QUEUE_NAME, true, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("接收到消息: " + message);}});}
}

3、生产者代码

生产者代码逻辑比较简单,获取到channel以后直接通过channel.basicPublish()发送消息即可。

/*** Description: 工作队列模式生产者*/
public class Producer {//队列名称private static final String QUEUE_NAME = "work_queue";public static void main(String[] args) throws Exception {// 1.通过工具类建立信道Channel channel = RabbitMqUtil.getChannel();// 2.从控制台获取输入,并将其作为消息发送消息队列Scanner scanner = new Scanner(System.in);while (scanner.hasNext()){String message = scanner.next(); channel.basicPublish("",QUEUE_NAME,null,message.getBytes()); System.out.println("生产者发出消息:"+message);}// 3.关闭资源channel.close();}
}

4、查看运行结果

先将消费者启动,因为消费者1的代码中负责声明了work_queue队列,再启动生产者进行消息的发送。image.pngimage.pngimage.png
通过上述执行结果可以发现在工作队列工作模式下,消息队列是通过轮询的方式将消息轮流发送给所有消费者,当第一条消息到达消费者1时,消费者2则不能接收到这条消息,同理反之亦然。两者接受到的消息是互斥的。

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

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

相关文章

SpringBoot篇(二、制作SpringBoot程序)

目录 一、代码位置 二、四种方式 1. IDEA联网版 2. 官网 3. 阿里云 4. 手动 五、在IDEA中隐藏指定文件/文件夹 六、复制工程-快速操作 七、更改引导类别名 一、代码位置 二、四种方式 1. IDEA联网版 2. 官网 官网制作:Spring Boot 3. 阿里云 阿里云版制…

基于SSM+微信小程序的家庭记账本管理系统(家庭1)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 1、管理员端功能有首页、个人中心、用户管理,消费详情管理、收入详情管理、系统管理等。 2、用户端功能有首页、消费详情、收入详情、论坛信息、我的等功能。 2、项目技术 …

django5入门【02】创建新的django程序

注意: ⭐前提:已经安装了python以及django所依赖的包1、通过django-admin管理工具在命令行创建Django应用程序,创建命令如下: django-admin startproject ProjectName❓ 疑问:除了使用命令行创建django程序外&#x…

OCR经典神经网络(三)LayoutLM v2算法原理及其在发票数据集上的应用(NER及RE)

OCR经典神经网络(三)LayoutLM v2算法原理及其在发票数据集上的应用(NER及RE) LayoutLM系列模型是微软发布的、文档理解多模态基础模型领域最重要和有代表性的工作: LayoutLM v2:在一个单一的多模态框架中对文本(text)、布局&…

eQEP正交解码

目录 基本介绍 整体框架 关键模块 编译问题 实验效果 基本介绍 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感器,我们可以通过编码器测量到位移或者速度信息。编码器从输出数据类型上分,可以分为增量式编码器和绝对式编码器。…

深入浅出MySQL:概述与体系结构解析

目录 1. 初识MySQL1.1. 数据库1.1.1. OLTP(联机事务处理)1.1.2. OLAP(联机分析处理) 2. SQL2.1. 定义2.2. DQL(数据查询语言)2.3. DML(数据操纵语言)2.4. DDL(数据定义语…

Python基于OpenCV的实时疲劳检测

2.检测方法 1)方法 与用于计算眨眼的传统图像处理方法不同,该方法通常涉及以下几种组合: 1、眼睛定位。 2、阈值找到眼睛的白色。 3、确定眼睛的“白色”区域是否消失了一段时间(表示眨眼)。 相反,眼睛长…

Python网络请求库requests的10个基本用法

大家好!今天我们要聊聊Python中非常实用的一个库——requests。这个库让发送HTTP请求变得超级简单。无论你是想抓取网页数据还是测试API接口,requests都能派上大用场。下面我们就一起来看看如何使用requests完成一些常见的任务。 引言 随着互联网技术的…

队列(数据结构)——C语言

目录 1.概念与结构 2.队列的实现 初始化QueueInit 申请新节点BuyNode 入队QueuePush 判断队为空QueueEmpty 出队QueuePop 读取队头数据QueueFront 读取队尾数据QueueBack 元素个数QueueSize 销毁队列QueueDestroy 3.整体代码 (文章中结点和节点是同一个意思) 1.概…

keil兼容C51和ARM,C251

三合一 C51,AEM,C251获取STC32的包 将 C51,AEM,C251安装到一块。 C51,AEM,C251 将三个软件分别下载到不同的文件夹KEIL,MDK,KEIL2里。 然后打开KEIL,MDK,KEIL2文件夹,复制KEIL文件夹里的C51和KEIL2文件夹里的C251的文件夹到MDK文件夹里。 打开KEIL和KEIL2文件夹里…

单链表的经典算法OJ

目录 1.反转链表 2.链表的中间节点 3.移除链表元素 ——————————————————————————————————————————— 正文开始 1.反转链表 typedef struct ListNode ListNode; struct ListNode* reverseList(struct ListNode* head) {//判空if(…

运行kafka查看所有主题Topic报错zookeeper is not a recognized option

执行命令查看:./kafka-topics.sh --list --zookeeper localhost:2181 报错 zookeeper is not a recognized option joptsimple.UnrecognizedOptionException: zookeeper is not a recognized optionat joptsimple.OptionException.unrecognizedOption(OptionExcept…

000010 - Mapreduce框架原理

Mapreduce框架原理 1. InputFormat 数据输入1.1 切片与 MapTask 并行度决定机制1.2 Job 提交流程源码和切片源码详解1.2.1 Job 提交流程源码详解1.2.2 FileInputFormat 切片源码解析(input.getSplits(job)) 1.3 FileInputFormat 切片机制1.3.1 切片机制1…

二、PyCharm基本设置

PyCharm基本设置 前言一、设置中文汉化二、设置代码字体颜色三、设置鼠标滚轮调整字体大小四、修改 PyCharm 运行内存4.1 方式一4.1 方式二 五、显示 PyCharm 运行时内存六、设置代码模版配置的参数有: 七、PyCharm设置背景图总结 前言 为了让我们的 PyCharm 更好用…

一家射频芯片企业终止,报告期持续亏损,高端产品占比不足

飞骧科技终止原因如下:飞骧科技从事的射频芯片行业如今竞争激烈,飞骧科技的产品主要应用于中低端手机,如摩托罗拉、传音,相比同行业上市公司已经退出的低集成度市场,相关产品展飞骧科技业务比重仍然不低。交易所质疑其…

【Matlab】基于Prandtl−Ishlinskii的迟滞模型-RLS辨识

PI模型 PI迟滞模型的输出公式: 代码记录 此代码为根据PI模型,已知输入(正弦函数幅值为3.5)、阈值以及权重值,利用matlab生成迟滞回线。 %% The Prandtl-Ishlinskii Hysteresis Model- %% 20241021 clc;clear; close…

数据结构与算法——Java实现 44.翻转二叉树

目录 226. 翻转二叉树 思路 代码 本地代码测试 不管前方的路有多苦 只要走的方向正确 不管多么崎岖不平 都比站在原地更接近幸福 —— 24.10.21 226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输…

Unity AnimationClip详解(2)——动画数据的优化

【内存优化】 首先要意识到运行时和编辑时的区别,当运行时和编辑时所需的数据相差不大时,我们用同一套数据结构即可,当两者差异较多或者数据量很大时,需要有各自的数据结构,这意味着在打包或构建时需要将编辑时数据转…

【Linux探索学习】第七弹——Linux的工具(二):Linux下vim编辑器的使用详解

Linux的工具(一):【Linux探索学习】第六弹——Linux的工具(一):Ubuntu系统下的软件包管理器_ubuntu软件管理器-CSDN博客 前言: 在学习Linux之前,相信大家都或多或少的学习过一些计算…

微信小程序用开发工具在本地真机调试可以正常访问摄像头,发布了授权后却无法访问摄像头,解决方案

今天开发上线了一个拍照的微信小程序&#xff0c;用uniapp的Vue3开发的&#xff0c;调用的camera组件&#xff0c;相关代码如下&#xff1a; <!-- 微信小程序相机组件 --><view v-if"showCamera" class"camera-container"><camera :device…