RabbitMQ-工作队列

news/2025/3/4 7:38:57/
接上文 RabbitMQ-死信队列

1 工作队列模式

xx模式只是一种设计思路,并不是指具体的某种实现,可理解为实现XX模式需要怎么去写业务代码。

之前的是简单的一个消费者一个生产者模式,下边是一个生产者多个消费者的情况:

在这里插入图片描述

这里先定义两个监听器

    @RabbitListener(queues = "yyds")public void receiver(String data){   //这里直接接收String类型的数据System.out.println("一号消息队列监听器 "+data);}@RabbitListener(queues = "yyds")public void receiver2(String data){System.out.println("二号消息队列监听器 "+data);}

在这里插入图片描述
把配置类的JSON转换和死信队列定义删掉
在这里插入图片描述
在rabbitmq网页管理端把死信队列和yyds队列都删除,死信交换机也删除
在这里插入图片描述
在这里插入图片描述
启动服务
在这里插入图片描述
出现队列
在这里插入图片描述
然后在amq.direct交换机发送消息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以发现默认是轮询方式发送的。

此时若将服务关闭,先在交换机发送几条信息,然后再启动服务,那么这几条信息会首先给一号监听器。

关闭服务
在这里插入图片描述
发送3条消息,
在这里插入图片描述
启动服务器
在这里插入图片描述

进入队列详情,可以看到每个消费者都有prefetch count =250。这代表若开启服务前预先有消息在队列,然后开启了监听,会将前250个预存的消息给一号,251-500给二号这样轮询。
这样的话若一开始存在消息,会被一个消费者一次性全部消耗,因为没有对prefetch count(预获取数量,一次性获取消息的最大数量)进行限制,若希望消费者一次只拿一个消息,而不是将所有消息全部获取,可进行配置。

在这里插入图片描述

在配置类定义一个自定义的ListenerContainerFactory,可以在这里设定消费者Channel的PrefetchCount的大小

@Resource
private CachingConnectionFactory connectionFactory;@Bean(name = "listenerContainer")
public SimpleRabbitListenerContainerFactory listenerContainer(){SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setPrefetchCount(1);   //将PrefetchCount设定为1表示一次只能取一个return factory;
}

在这里插入图片描述

监听器指定工厂

在这里插入图片描述

然后关闭服务,在第二个交换机amq.direct发送3条数据

在这里插入图片描述在这里插入图片描述

启动服务,出现轮询效果,二号连着两条还是因为没有添加休眠

在这里插入图片描述

此时队列详情的一次最大获取数量变为1

在这里插入图片描述
除了定义连个相同的监听方法,还可以在注解中定义,比如定义10个同样的消费者:

  @RabbitListener(queues = "yyds",  containerFactory = "listenerContainer", concurrency = "10")public void receiver(String data){System.out.println("一号消息队列监听器 "+data);}

在这里插入图片描述
重启服务,出现10个消费者
在这里插入图片描述


http://www.ppmy.cn/news/1135884.html

相关文章

QT 实现 TCP 客户端服务器代码

服务器 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件 #include<QList> //链表容器 #include<Q…

miniOB笔记

一条SQL语句的处理过程 RC SessionStage::handle_sql(SQLStageEvent *sql_event) {RC rc query_cache_stage_.handle_request(sql_event);if (OB_FAIL(rc)) {LOG_TRACE("failed to do query cache. rc%s", strrc(rc));return rc;}// SQL语法分析 rc parse_stage_.…

TunnelSectionPaletteSet 2023/9/28 下午10:33:16

TunnelSectionPaletteSet 2023/9/28 下午10:33:16 TunnelSectionPaletteSet是一个术语,它可能指代在隧道设计或工程中使用的一种工具或系统。然而,由于缺乏具体的背景和上下文信息,我无法提供更详细的解释。如果您能够提供更多相关的信息或明确您的问题,我将尽力给予帮助…

族的概念理解

在数学和统计学中&#xff0c;“族”&#xff08;family&#xff09;是指一组具有某种共性或特定性质的数学对象的集合。这些数学对象可以是函数、集合、概率分布、曲线、矩阵等等。"族"的概念用于描述这些对象之间的关联或共同属性。 具体来说&#xff0c;"族…

一道求导题:1004T3

需要知识: ( x n ) ′ n x n − 1 (x^n)nx^{n-1} (xn)′nxn−1 ( s i n x ) ′ c o s x (sinx)cosx (sinx)′cosx [ f ( g ( x ) ) ] ′ f ′ ( g ( x ) ) g ′ ( x ) [f(g(x))]f(g(x))\times g(x) [f(g(x))]′f′(g(x))g′(x) 推完之后&#xff0c;考虑导函数与x轴的交点…

计算机竞赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习行人重识别(person reid)系统 该项目…

【多媒体技术与实践】音频信息获取和处理——编程题汇总

1&#xff1a;音频信息数据量计算 已知采样频率&#xff08;单位KHz&#xff09;、量化位数、声道数及持续时间&#xff08;单位分钟&#xff09;&#xff0c;求未压缩时的数据量&#xff08;单位MB&#xff09;. 例如&#xff1a; 输入&#xff1a; 22.05 16 2 3 &#xff…

Ventoy万能U盘安装系统,支持任何的操作系统安装

Ventoy万能U盘安装系统&#xff0c;支持任何的操作系统安装&#xff1a; Download . VentoyVentoy is an open source tool to create bootable USB drive for ISO files. With ventoy, you dont need to format the disk again and again, you just need to copy the iso fil…