工作队列模式
一、原理流程图
二、基本知识
工作队列模式(Work Queue Model)是一种消息队列模型,生产者将任务分发到队列中,多个消费者从队列中按顺序获取并处理任务。该模式主要用于负载均衡,确保任务能够均匀分配给不同的消费者,提升系统的处理能力。
基本特点:
- 消息分发:生产者发送的每个消息只会被一个消费者处理。
- 消息持久化:队列可以设置为持久化,以保证在服务重启后,未处理的消息不会丢失。
- 负载均衡:多个消费者可以并发消费队列中的消息,实现负载分摊。
三、代码
1. 生产者代码
java
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. 消费者代码
java
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 -> {});
}
}
四、结果
生产者发送消息,消费者接收消息的结果如下:
- 生产者控制台输出:
- 消费者控制台输出:
注意 :由于直接打印的是对象而非内容,所以输出格式可能看起来比较奇怪。可以使用
new String(message.getBody(), "UTF-8")
来将消息转换为字符串形式。