RabbitMQ 普通模式
一、普通模式示意图
二、普通模式介绍
RabbitMQ 普通模式也称为点对点模式,它是消息队列的一种基本实现方式。在这种模式下,生产者将消息发送到队列中,消费者从队列中接收并处理消息。每条消息只会被一个消费者接收,其他消费者无法重复消费。
特点:
- 单一消费者模式:生产者发送的每条消息只能被一个消费者处理,适用于需要确保每条消息只被处理一次的场景。
- 消息持久化:通过将队列设置为持久化,可以在RabbitMQ服务重启后保留消息,防止数据丢失。
- 自动应答机制:消费者可以选择是否自动应答,以便在处理消息失败时重新接收未确认的消息。
- 消息确认机制:RabbitMQ 支持手动和自动消息确认,确保消息可靠传递。
使用场景:
- 简单任务队列
- 需要确保任务不被重复处理的场景
- 点对点通讯的应用
三、普通模式代码
1. 生产者端代码
java
package com.lucifer.rabbitmq.one;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class producer {
// 队列名
public static final String QUEUE_NAME = "hello";
// 发消息
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 工厂ip
factory.setHost("1.94.97.29");
// 设置用户名和密码
factory.setUsername("guest");
factory.setPassword("123456");
// 创建连接
Connection connection = factory.newConnection();
// 获取信道
Channel channel = connection.createChannel();
// 生成一个队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 消息内容
String message = "hello world";
// 发送消息到队列
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
}
}
2. 消费者端代码
java
package com.lucifer.rabbitmq.one;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class consumer {
// 队列名
public static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("1.94.97.29");
factory.setUsername("guest");
factory.setPassword("123456");
// 创建连接
Connection connection = factory.newConnection();
// 获取信道
Channel channel = connection.createChannel();
// 声明消息接收回调函数
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println(new String(message.getBody()));
};
// 声明取消消息的回调函数
CancelCallback cancelCallback = consumerTag -> {
System.out.println("消费消息被中断");
};
// 消费消息
channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
}
}