首页 > 其他分享 >SpringAMQP的工作队列WorkQueue

SpringAMQP的工作队列WorkQueue

时间:2024-06-05 22:22:11浏览次数:14  
标签:SpringAMQP 消费者 队列 queue simple 消息 WorkQueue 监听

Work queue,工作队列,可以提高消息处理速度,避免队列消息堆积

 模拟WorkQueue,实现一个队列绑定多个消费者

基本思路如下:

在publisher服务中定义测试方法,每秒产生50条消息,发送到simple.queue
在consumer服务中定义两个消息监听者,都监听simple.queue队列
一个消息监听者每秒处理50条消息,另一个消费者每秒处理10条消息

生产者循环发送消息到simple.queue

@Test
public void testWorkQueue() throws InterruptedException {
String queueName = "simple.queue";
String message = "hello, work queue message=====";
for (int i = 0; i < 50; i++) {

rabbitTemplate.convertAndSend(queueName, message + i);
Thread.sleep(20);
}
}

编写两个消费者,都监听simple.queue

@RabbitListener(queues = "simple.queue")
public void listenWorkQueue1(String msg) throws InterruptedException {
System.out.println("listenWorkQueue1 消费者接收到消息 :【" + msg + "】");
Thread.sleep(25);
}

@RabbitListener(queues = "simple.queue")
public void listenWorkQueue2(String msg) throws InterruptedException {
System.err.println("listenWorkQueue2 消费者接收到消息 :【" + msg + "】");
Thread.sleep(100);
}

 

运行结果发现消费者监听不会因为监听性能好而多处理消息,而是信息被平均分配处理,这是由RabbitMQ内部消息预取机制造成

消息预取:当有大量的消息发送到队列,队列会提前将消息依次投递给每个消息消费者,不会关心消费者处理能力。

消息预取限制

修改application.yml文件,设置preFetch这个值,可以控制预取消息的上限

spring:
rabbitmq:
host: 192.168.223.128 # 主机名
port: 5672 # 端口
virtual-host: / # 虚拟主机
username: guest # 用户名
password: guest # 密码
listener:
simple:
prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息

标签:SpringAMQP,消费者,队列,queue,simple,消息,WorkQueue,监听
From: https://www.cnblogs.com/wjzohou/p/18234035

相关文章

  • 用Redisson的延迟队列RDelayedQueue处理延迟任务或者定时任务
    什么是RedissonRedisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。什么是RDelayedQueue获取RDelayedQueue:public<V>RDelayedQueue<V>getDelayedQueue(R......
  • 算法训练营第10天|理论基础 232.用栈实现队列 225. 用队列实现栈
    理论基础Java中实现栈有以下两种方式:stack类LinkedList实现(继承了Deque接口)(1)Stack实现Stack底层是使用Vector的,而Vector支持线程同步,所以整体性能相对较低,如果没有多线程的场景,不建议使用Stack。(2)LinkedList实现LinkedList实现了List,Deque(实现了Queue接口)的接口,底层是双......
  • 【第三节】C/C++数据结构之栈与队列
    目录一、数据结构-栈1.1栈的定义1.2栈的ADT(AbstractDataType)1.3栈的顺序存储结构及实现二、数据结构-队列2.1队列的定义2.2队列的ADT2.3队列的顺序存储结构与实现2.4优先队列一、数据结构-栈1.1栈的定义栈(Stack)可以看成是一种特殊的线性表。限......
  • 数据结构·栈和队列
    栈栈(Stack):只允许在一端插入或删除的线性表栈顶:线性表允许进行插入或删除的那一端栈底:固定的,不允许进行插入和删除的另一端特点:是受限的线性表,拥有线性关系;后进先出LIFO顺序栈使用顺序存储,自底向上存储数据元素,指针指向栈顶元素的位置操作s.top=-1;......
  • FreeRTOS-队列基础
    以下内容为个人的初学记录,如有错误,欢迎指正一、概述队列用于数据的传输,数据按照**“先进先出”**(FIFO)的规则;一般情况下,数据被放入到底部(Back)指向的位置(除非使用向头部写入数据的函数),被头部(Front)指向时被读出队列能够进行阻塞、唤醒,当接收任务发现队列为空时,会进入阻塞而......
  • Java数据结构-delayQueue-优先队列--信号量
    原编辑链接:https://www.yuque.com/zhaozhaozhaozhao-khkij/lp7g2t/blwysxg3ygb00dw6?singleDoc#《3delayqueue》Queue问题单端队列和双端队列,分别对应的实现类是哪个?○Java中的单项队列queue是用链表实现的,Queue本身是一个接口,继承了Collection集合;○双端队列(De......
  • 代码随想录算法训练营day13(栈与队列)
    代码随想录算法训练营day:学习内容:今天主要学习队列239347学习产出:239一开始想着直接暴力遍历,但是时间复杂度为nk。采用deque实现一个单调队列,因为我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最......
  • 栈和队列
    栈栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。栈顶(Top):线性表允许进行插入删除的那一端。栈底(Bottom):固定的,不允许进行插入和删除的另一端。空栈:不含任何元素的空表。栈又称为后进先出(LastInFirst......
  • C# 模拟http请求出现 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作[windo
    系统里面用到C#模拟Http请求,上线到服务器后,发现日志中大量出现“由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作”或“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”运行netstat-ano发现有大量的Tcp链接,怀疑可能是服务器各种请求太多了导致的服务器是w......
  • RabbitMQ 进阶使用之延迟队列 → 订单在30分钟之内未支付则自动取消
    开心一刻晚上,媳妇和儿子躺在沙发上儿子疑惑的问道:妈妈,你为什么不去上班媳妇:妈妈的人生目标是前20年靠父母养,后40年靠你爸爸养,再往后20年就靠你和妹妹养儿子:我可养不起媳妇:为什么儿子:因为,呃...,我和你的想法一样讲在前面如果你们对RabbitMQ感到陌生,那可以停止往下阅读了......