欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > rabbitmq 工作队列模式

rabbitmq 工作队列模式

2024/10/24 1:30:37 来源:https://blog.csdn.net/dhrmt/article/details/143064003  浏览:    关键词: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") 来将消息转换为字符串形式。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com