RabbitMQ-工作队列

news/2024/6/1 23:55:05 标签: rabbitmq, 分布式
接上文 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.niftyadmin.cn/n/5066866.html

相关文章

JAVA学习(4)-全网最详细~

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

数组结构与算法

文章目录 数据结构与算法稀疏数组sparse队列单向链表双向链表单向环形列表:CircleSingleLinkedList栈递归排序算法快速排序思路 树赫夫曼树 (HuffmanTree)二叉排序树(Binary sort tree)构建二叉树遍历二叉树 平衡二叉树…

鱼哥赠书活动第①期:《脑洞大开:透测试另类实战攻略》《Kali Linux高级渗透测试》《CTF实战:技术、解题与进阶》《构建新型网络形态下的网络空间安全体系》

鱼哥赠书活动第①期: 《脑洞大开:透测试另类实战攻略》1.1介绍: 《Kali Linux高级渗透测试》1.1介绍: 《CTF实战:技术、解题与进阶》1.1介绍: 《构建新型网络形态下的网络空间安全体系》1.1介绍&#xff1a…

【前后缀技巧】2022牛客多校3 A

登录—专业IT笔试面试备考平台_牛客网 题意: 思路: 这种是典中典中典,对于gcd,背包问题都是一样的处理方式 预处理出前缀lca和后缀lca,枚举哪个消失即可,可以统计方案数 Code: #include &l…

编写IDEA插件,实现根据现有代码生成流程图

实现根据现有代码生成流程图的功能需要考虑以下几个步骤: 分析代码结构,获取代码中的变量声明、分支语句、循环语句等语句结构。 根据代码结构生成流程图的节点和边。 将生成的流程图展示在IDEA界面中。 下面逐一说明以上步骤的实现方法:…

实战型开发2/3--架构设计

这里谈及在代码设计阶段以及重构阶段要考虑的架构方面问题&#xff0c;可以说是开发过程中的中层阶段&#xff1b; 主要是将 < the art of unix programming>< clean architecture>< the pragmatic programmer>< design patterns> 等几本书结合实践做…

代码随想录算法训练营第42天|动态规划:01背包理论基础、动态规划:01背包理论基础(滚动数组)、416. 分割等和子集

动态规划&#xff1a;01背包理论基础 动态规划&#xff1a;01背包理论基础&#xff08;滚动数组&#xff09; 以上两个问题的代码未本地化保存 416. 分割等和子集 https://leetcode.cn/problems/partition-equal-subset-sum/ 复杂的解法 class Solution { public:bool ca…

【已解决】在 Vite 项目中使用 eslint-config-ali 时遇到的解析错误

错误还原 搭建 Vite 项目 pnpm create vite my-vue-app --template vue-ts安装 eslint-config-ali pnpm i -D eslint-config-ali typescript-eslint/parser typescript-eslint/eslint-plugin eslint-plugin-import eslint-import-resolver-typescript vue-eslint-parser esl…