rabbitmq 工作队列模式

news/2024/10/24 0:53:54/

工作队列模式

一、原理流程图

工作队列模式原理流程图

二、基本知识

工作队列模式(Work Queue Model)是一种消息队列模型,生产者将任务分发到队列中,多个消费者从队列中按顺序获取并处理任务。该模式主要用于负载均衡,确保任务能够均匀分配给不同的消费者,提升系统的处理能力。

基本特点:

  1. 消息分发:生产者发送的每个消息只会被一个消费者处理。
  2. 消息持久化:队列可以设置为持久化,以保证在服务重启后,未处理的消息不会丢失。
  3. 负载均衡:多个消费者可以并发消费队列中的消息,实现负载分摊。

三、代码

1. 生产者代码

package com.lucifer.rabbitmq.workQueues;import com.lucifer.rabbitmq.utils.RabbitMqUtils;
import com.rabbitmq.client.Channel;
import java.util.Scanner;/*** @Author:丁浩然* @Package:com.lucifer.rabbitmq.workQueues* @Project:rabbitMq_learning* @Filename:task01* @Date:2024/10/18* @Purpose:生产者,用于产生大量的消息*/
public class Task01 {// 定义队列名称public static final String QUEUE_NAME = "hello";public static void main(String[] args) throws Exception {// 获取通道Channel channel = RabbitMqUtils.getChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 从控制台接受输入Scanner sc = new Scanner(System.in);System.out.println("请输入消息,按回车发送(输入exit退出):");while (sc.hasNext()) {String message = sc.next();if ("exit".equals(message)) {break;}// 发送消息到队列channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println("已发送消息:" + message);}sc.close();channel.close();}
}

2. 消费者代码

package com.lucifer.rabbitmq.workQueues;import com.lucifer.rabbitmq.utils.RabbitMqUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;/*** @Author:丁浩然* @Package:com.lucifer.rabbitmq.workQueues* @Project:rabbitMq_learning* @Filename:worker* @Date:2024/10/18* @Purpose:消费者,接收并处理消息*/
public class Worker {public static final String QUEUE_NAME = "hello";public static void main(String[] args) throws Exception {// 获取通道Channel channel = RabbitMqUtils.getChannel();// 消费者回调函数,用于处理消息DeliverCallback deliverCallback = (consumerTag, message) -> {System.out.println("接收到消息:" + new String(message.getBody(), "UTF-8"));};// 消费消息channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});}
}

四、结果

生产者发送消息,消费者接收消息的结果如下:

  1. 生产者控制台输出

生产者控制台输出

  1. 消费者控制台输出

消费者控制台输出

注意:由于直接打印的是对象而非内容,所以输出格式可能看起来比较奇怪。可以使用 new String(message.getBody(), "UTF-8") 来将消息转换为字符串形式。


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

相关文章

VScode分文件编写报错 | 如何进行VScode分文件编写 | 小白也能轻松解决版

分文件编写遇到的问题 分文件编写例子如下所示: 但是直接使用 Run Code 或者 调试C/C文件 会报错如下: 正在执行任务: C/C: g.exe 生成活动文件 正在启动生成… cmd /c chcp 65001>nul && D:\Librarys\mingw64\bin\g.exe -fdiagnostics-col…

九、pico+Unity交互开发——触碰抓取

一、VR交互的类型 Hover(悬停) 定义:发起交互的对象停留在可交互对象的交互区域。例如,当手触摸到物品表面(可交互区域)时,视为触发了Hover。 Grab(抓取) 概念&#xff…

word中的内容旋转90度

在vsto、Aspose.Words 中,默认没有直接的 API 可以让表格整体旋转 90 度。然而,我们可以通过一些方式来实现类似的效果,具体思路如下: 将表格插入到一个形状(Shape)或文本框中,然后旋转该形状。…

基于SpringBoot+Vue+uniapp的诗词学习系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

|人口分析|007_django基于Python的广东省人口流动数据分析2024_92306i61

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

Python数据类型详解:10个你必须掌握的类型

Python 是一种动态类型语言,这意味着变量的类型是在运行时确定的。Python 提供了多种内置数据类型,用于存储和操作不同类型的数据。以下是 10 个你必须掌握的 Python 数据类型,每个类型都附有示例代码。 1. 数字类型(Numeric Typ…

2024年【焊工(高级)】新版试题及焊工(高级)试题及解析

题库来源:安全生产模拟考试一点通公众号小程序 焊工(高级)新版试题是安全生产模拟考试一点通总题库中生成的一套焊工(高级)试题及解析,安全生产模拟考试一点通上焊工(高级)作业手机…

MySQLDBA修炼之道-开发篇(一)

三、开发基础 1. 数据模型 1.1 关系数据模型介绍 关于NULL 如果某个字段的值是未知的或未定义的&#xff0c;数据库会提供一个特殊的值NULL来表示。NULL值很特殊&#xff0c;在关系数据库中应该小心处理。例如查询语句“select*from employee where 绩效得分<85 or>绩…