本文全面介绍了手写MQ资料的准备工作,包括所需编程语言的选择和开发环境的搭建,详细讲解了创建消息队列的基本步骤、消息的发布与接收流程以及消息确认与持久化机制。文章还提供了丰富的示例代码,帮助读者理解和实践MQ的编写与应用。
MQ基础概念 什么是MQ以及其重要性消息队列(Message Queue,简称MQ)是一种中间件,用于在分布式系统中提供异步解耦通信。消息队列的主要功能是解耦服务之间的通信,使得各个服务之间可以独立运行,互不影响。消息队列能够提高系统的稳定性和可靠性,减少系统间的耦合度,实现高性能、高可用性、可扩展性、灵活性和可维护性。
重要性
消息队列在现代软件架构中扮演着至关重要的角色,以下是其重要性的一些方面:
- 异步通信:通过消息队列,服务之间可以异步地进行通信,从而提高系统的响应速度和性能。
- 解耦服务:服务之间的依赖关系被解耦,服务可以独立扩展和维护。
- 流量削峰:在高并发场景下,消息队列可以作为缓冲区,减少峰值流量对系统的影响。
- 消息重试:消息可以被多次尝试发送,确保消息最终能够被正确处理。
- 数据持久化:消息可以持久化存储,即使系统崩溃也能恢复消息的传递。
- 负载均衡:消息队列能够将消息分发到多个消费者,实现负载均衡。
消息队列的基本工作原理涉及以下几个关键组件:
- 生产者(Producer):生产者是生成消息并发送到消息队列的组件。生产者不需要等待消息的处理结果,可以异步发送消息。
- 消息队列(Message Queue):消息队列是消息的存储和分发组件。它负责接收生产者发送的消息,并将消息传递给消费者。
- 消费者(Consumer):消费者是从消息队列中接收消息并处理消息的组件。消费者可以异步处理消息,从而提高系统的响应速度和性能。
消息队列的处理流程如下:
- 生产者将消息发送到消息队列。
- 消息队列将消息存储并分发给一个或多个消费者。
- 消费者从消息队列中接收消息并处理消息。
- 消费者向消息队列确认消息的处理结果。
- 消息队列根据确认结果决定是否删除消息或重新发送消息。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class MessageProducer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (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("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
public class MessageConsumer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}
}
MQ在系统中的作用与应用场景
消息队列在系统中的作用与应用场景多样,以下是一些常见的应用场景:
- 日志处理:将日志消息发送到消息队列,然后由日志处理系统来处理日志消息。
- 文件传输:将文件上传请求发送到消息队列,然后由文件处理系统来处理文件。
- 任务调度:将任务请求发送到消息队列,然后由任务调度系统来调度任务。
- 负载均衡:将请求发送到消息队列,然后由负载均衡系统来分发请求。
- 异步通信:服务之间通过消息队列异步通信,提高系统响应速度和性能。
- 降级处理:在高并发场景下,通过消息队列实现降级处理。
- 数据流处理:将数据流发送到消息队列,然后由数据处理系统来处理数据流。
示例代码
以下是一个简单的Python代码示例,展示了如何使用Kafka实现消息生产和消费:
from kafka import KafkaProducer, KafkaConsumer
producer = KafkaProducer(bootstrap_servers='localhost:9092')
producer.send('my_topic', b'Hello, World!')
producer.flush()
producer.close()
consumer = KafkaConsumer('my_topic', bootstrap_servers='localhost:9092')
for message in consumer:
print(f"Received message: {message.value}")
consumer.close()
MQ的分类与选择
常见MQ消息队列的分类(如Kafka、RabbitMQ等)
消息队列有许多不同的实现方式和技术,每种实现方式和技术都有其特点和适用场景。以下是一些常见的消息队列的分类:
- RabbitMQ:支持AMQP协议的开源消息队列,具有高可用性和可靠性。
- Kafka:由LinkedIn开发的分布式流处理平台,具有高吞吐量和持久化能力。
- ActiveMQ:由Apache开发的开源消息队列,支持多种消息协议。
- RocketMQ:由阿里巴巴开发的开源消息队列,具有高吞吐量和可靠性。
- RabbitMQ vs Kafka vs RocketMQ:RabbitMQ适合实时消息传递和日志处理,Kafka适合大规模数据流处理,RocketMQ适合高并发和高可用性场景。
- RabbitMQ vs Kafka vs RocketMQ比较:RabbitMQ具有高可用性和可靠性,Kafka具有高吞吐量和持久化能力,RocketMQ具有高并发和高可用性。
- RabbitMQ vs Kafka vs RocketMQ总结:选择消息队列时,需要根据系统的需求和特点来选择合适的消息队列。
选择消息队列时,需要考虑以下几个因素:
- 性能:消息队列的吞吐量、延迟和可靠性。
- 扩展性:消息队列的可扩展性和可维护性。
- 可靠性:消息队列的持久化能力和可靠性。
- 协议支持:消息队列支持的消息协议和协议兼容性。
- 社区支持:消息队列的社区支持和活跃度。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class MessageProducer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (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("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
public class MessageConsumer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}
}
手写MQ资料准备工作
了解必要的编程语言(如Java、Python等)
在手写MQ资料之前,需要了解一些必要的编程语言,如Java、Python等。编程语言的选择取决于消息队列的实现方式和技术。
- Java:Java是一种广泛使用的编程语言,具有丰富的开发工具和框架,如Spring、Hibernate等。
- Python:Python是一种简洁明了的脚本语言,具有丰富的开发库和框架,如Django、Flask等。
- 编程语言选择:选择编程语言时,需要考虑系统的开发环境和开发人员的技能水平。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class MessageProducer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (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("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
public class MessageConsumer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}
}
准备开发环境和工具
在手写MQ资料之前,需要准备开发环境和工具,如IDE、编译器、调试器等。
- IDE:IDE(集成开发环境)是一种集成了编译器、调试器、版本控制等工具的开发环境,如Eclipse、IntelliJ IDEA、PyCharm等。
- 编译器:编译器是一种将源代码编译成目标代码的工具,如javac、gcc等。
- 调试器:调试器是一种帮助开发人员调试程序的工具,如JDB、GDB等。
- 开发环境搭建:需要根据编程语言和开发工具的要求,搭建开发环境。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class MessageProducer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (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("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
public class MessageConsumer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}
}
手写MQ的步骤详解
创建消息队列的基本步骤
创建消息队列的基本步骤如下:
- 创建连接:创建到消息队列服务器的连接。
- 创建通道:创建通道(Channel)用于发送和接收消息。
- 声明队列:声明队列,如果队列不存在,则创建队列。
- 发送消息:通过通道发送消息到队列。
- 接收消息:通过通道接收消息。
- 关闭连接:关闭连接。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class MessageProducer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (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("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
public class MessageConsumer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}
}
消息的发布与接收流程
消息的发布与接收流程如下:
- 创建连接:创建到消息队列服务器的连接。
- 创建通道:创建通道(Channel)用于发送和接收消息。
- 声明队列:声明队列,如果队列不存在,则创建队列。
- 发送消息:通过通道发送消息到队列。
- 接收消息:通过通道接收消息。
- 关闭连接:关闭连接。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class MessageProducer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (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("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
public class MessageConsumer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}
}
消息确认与持久化机制
消息确认与持久化机制如下:
- 消息确认:消息队列支持消息确认机制,确保消息被正确处理。
- 消息持久化:消息队列支持消息持久化机制,确保消息在系统崩溃后仍然存在。
- 示例代码:以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费,并使用消息确认和持久化机制。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费,并使用消息确认和持久化机制:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class MessageProducer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
String message = "Hello, World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
public class MessageConsumer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> { });
}
}
}
常见问题及解决方法
手写MQ过程中常见的错误及解决方案
手写MQ过程中常见的错误及解决方案如下:
- 消息丢失:消息队列支持消息确认机制,确保消息被正确处理。
- 消息重复:消息队列支持消息持久化机制,确保消息在系统崩溃后仍然存在。
- 性能问题:消息队列支持消息分片和负载均衡机制,提高系统性能。
- 示例代码:以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费,并解决消息丢失和消息重复问题。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费,并解决消息丢失和消息重复问题:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class MessageProducer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
String message = "Hello, World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
public class MessageConsumer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> { });
}
}
}
性能优化与调试技巧
性能优化与调试技巧如下:
- 减少消息大小:减小消息大小可以提高系统性能。
- 减少消息频率:减小消息频率可以提高系统性能。
- 增加消息队列数量:增加消息队列数量可以提高系统性能。
- 示例代码:以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费,并优化性能。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费,并优化性能:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class MessageProducer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (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("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
public class MessageConsumer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}
}
实战演练与案例分析
实际项目中的MQ使用案例
实际项目中的MQ使用案例如下:
- 日志处理:将日志消息发送到消息队列,然后由日志处理系统来处理日志消息。
- 文件传输:将文件上传请求发送到消息队列,然后由文件处理系统来处理文件。
- 任务调度:将任务请求发送到消息队列,然后由任务调度系统来调度任务。
- 负载均衡:将请求发送到消息队列,然后由负载均衡系统来分发请求。
- 异步通信:服务之间通过消息队列异步通信,提高系统响应速度和性能。
- 降级处理:在高并发场景下,通过消息队列实现降级处理。
- 数据流处理:将数据流发送到消息队列,然后由数据处理系统来处理数据流。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费,并实现任务调度。
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class TaskProducer {
private static final String TASK_QUEUE_NAME = "taskQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(TASK_QUEUE_NAME, false, false, false, null);
String task = "Hello, World!";
channel.basicPublish("", TASK_QUEUE_NAME, null, task.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + task + "'");
}
}
}
public class TaskConsumer {
private static final String TASK_QUEUE_NAME = "taskQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(TASK_QUEUE_NAME, false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String task = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + task + "'");
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
System.out.println(" [x] Done");
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
channel.basicConsume(TASK_QUEUE_NAME, false, deliverCallback, consumerTag -> { });
}
}
}
分享手写MQ的实战经验与心得
分享手写MQ的实战经验与心得如下:
- 深入了解消息队列:深入了解消息队列的工作原理和机制,理解消息队列的优缺点。
- 选择合适的消息队列:选择合适的消息队列,根据系统的性能和可靠性需求选择合适的消息队列。
- 编写高质量的代码:编写高质量的代码,确保代码的可读性、可维护性和可扩展性。
- 使用消息确认机制:使用消息确认机制,确保消息被正确处理。
- 使用消息持久化机制:使用消息持久化机制,确保消息在系统崩溃后仍然存在。
- 使用消息分片和负载均衡机制:使用消息分片和负载均衡机制,提高系统性能。
- 使用消息队列监控工具:使用消息队列监控工具,监控消息队列的状态和性能。
示例代码
以下是一个简单的Java代码示例,展示了如何使用RabbitMQ实现消息生产和消费,并使用消息确认机制和消息持久化机制。
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class MessageProducer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
String message = "Hello, World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
public class MessageConsumer {
private static final String QUEUE_NAME = "myQueue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> { });
}
}
}
通过以上详细的指南和示例代码,我们希望能够帮助读者更好地理解和实践MQ的编写与应用,确保在实际项目中能够灵活且高效地利用MQ提供的优势。希望这些内容对你的学习和实践有所帮助!