当前位置: 首页 > article >正文

rabbitmq 工作队列模式

工作队列模式

一、原理流程图

工作队列模式原理流程图

二、基本知识

工作队列模式(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.kler.cn/news/362271.html

相关文章:

  • SQL 自学:游标(Cursors)的理解与应用
  • Java程序设计:spring boot(8)——API ⽂档构建⼯具 - Swagger2
  • 关于Docker
  • 5.redis安装【Docker】
  • Lua简介
  • 工厂设计模式(Factory Pattern)
  • Cloudera Hue深度解析:安装、配置到高级用法
  • 请求第三方接口有反斜杠和双引号怎么处理,且做格式校验?
  • 九、pico+Unity交互开发——触碰抓取
  • ABAP 静态与动态搜索帮助
  • 太速科技-426-基于XC7Z100+TMS320C6678的图像处理板卡
  • Leetcode 3200. 三角形的最大高度
  • 滑动窗口数据采集
  • [漏洞挖掘与防护] 04.Windows系统安全缺陷之5次Shift漏洞启动计算机机理分析
  • java设计模式--行为型模式
  • 【Linux】磁盘文件系统(inode)、软硬链接
  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”
  • 优化UVM环境(九)-将interface文件放在env pkg外面
  • 深入剖析:神经网络的结构与功能解读
  • 数字化时代的智能ERP管理系统:引领企业高效管理与创新发展
  • 【工具】第九期:高频交易系统开发简介与使用-03
  • MeshXL: Neural Coordinate Field forGenerative 3D Foundation Models 论文解读
  • Qml-Popup的使用
  • 【Linux】Linux进程地址空间
  • 关于QT cmake项目添加了.ui文件build未自动生成ui_xxx.h,错误提示找不到这个头文件问题处理
  • C++进阶之路:再谈构造函数、static成员、友元(类与对象_下篇)