您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
尚硅谷RabbitMQ视频-009-基础篇-工作模式-Work Queues
发布时间:2026-10-21 02:11:31编辑:雪饮阅读()
-
之前的demo是简单模式,是 RabbitMQ 官方第一个入门模式:
1 个生产者(Producer)
1 个队列(Queue)
1 个消费者(Consumer)
使用 default 默认交换机(direct),其余参数默认
一句话:生产者发消息到队列,单个消费者监听这个队列,一条消息只会被这一个消费者消费一次。
那么接下来我来实现的是一个生产者产生很多消息,然后由多个消费者去消费这些消息。
RabbitMQ 的 Work Queues 模式 (工作队列模式),也叫做 点对点模式 或 任务队列模式 。
特点:
1. 一个生产者 对应 多个消费者
2. 消息发送到队列中,多个消费者竞争消费消息
3. 每条消息只会被 一个消费者 处理
4. 默认采用 轮询分发 (Round Robin)策略,消息均匀分配给各个消费者
工具类:
ConnectionUtil.java:
package org.example.workQueues.util;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class ConnectionUtil {
public static final String HOST_ADDRESS = "localhost";
public static Connection getConnection() throws Exception {
// 定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置服务地址
factory.setHost(HOST_ADDRESS);
// 端口
factory.setPort(5672);
//设置账号信息,用户名、密码、vhost
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("123456");
// 通过工厂获取连接
Connection connection = factory.newConnection();
return connection;
}
public static void main(String[] args) throws Exception {
Connection con = ConnectionUtil.getConnection();
System.out.println(con);
con.close();
}
}
生产者:
Producer.java:
package org.example.workQueues;
import org.example.workQueues.util.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
public class Producer {
public static final String QUEUE_NAME = "work_queue";
public static void main(String[] args) throws Exception {
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
for (int i = 1; i <= 10; i++) {
String body = i + "hello rabbitmq~~~";
channel.basicPublish("", QUEUE_NAME, null, body.getBytes());
}
channel.close();
connection.close();
}
}
消费者1:
Consumer1.java:
package org.example.workQueues;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.example.workQueues.util.ConnectionUtil;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class Consumer1 {
static final String QUEUE_NAME = "work_queue";
public static void main(String[] args) throws Exception {
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.out.println("Consumer1 body:" + new String(body) + " | time:" + time);
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
消费者2:
Consumer2.java:
package org.example.workQueues;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.example.workQueues.util.ConnectionUtil;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class Consumer2 {
static final String QUEUE_NAME = "work_queue";
public static void main(String[] args) throws Exception {
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.out.println("Consumer2 body:" + new String(body) + " | time:" + time);
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
分别运行生产者,消费者1和消费者2.
最好是先运行消费1和消费者2,然后运行生产者,然后观察消费者1和消费者2的输出基本可以看出来是消息均分给两个消费者进行消费的。
关键字词:尚硅谷,RabbitMQ 工作模式,工作模式 Work,Work Queues,尚硅谷RabbitMQ,工作模式,Work,Queues
相关文章
- flutter-示例目录(网络请求及windows端运行与网络请求
- p16(Vary your routes and work-outs,so you're not d
- vmwareWorkStation 16 Pro为mac13.5.1关闭系统完整性
- vmwareWorkStation 安装vmware Tools与远程桌面(vnc屏
- vmwareWorkStation 16 Pro安装mac 13.5.1
- 尚硅谷Docker核心技术学习笔记
- GatewayWorker-Linux系统快速开始(从一个精简的聊天dem
- workerman-webman入門到精通
- webman安裝
- workerman入門到精通系列之第一季workerman(共313節詳