java如何实现rabbitmq的消息确认机制和消息持久化机制配置和示例

在Java中,使用RabbitMQ的客户端库(通常是AMQP客户端库,如RabbitMQ的Java客户端)可以方便地实现消息确认机制和消息持久化机制。以下是如何实现这两个机制的示例。

1、消息确认机制

RabbitMQ支持两种类型的确认:生产者到交换机的确认(通常在发送时默认进行)和消费者到队列的确认。在Java中,消费者确认通常通过手动确认消息来实现。

1、生产者示例

java 复制代码
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Channel;

public class Producer {
    private final static String QUEUE_NAME = "my_queue";

    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 + "'");
        }
    }
}

2、消费者示例(使用手动确认)

java 复制代码
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    private final static String QUEUE_NAME = "my_queue";

    public static void main(String[] argv) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + message + "'");
            
            // 手动确认消息
            try {
                channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
            } catch (IOException e) {
                e.printStackTrace();
            }
        };
        channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> { });
    }
}

在上面的消费者示例中,basicConsume方法的第二个参数设置为false,表示消息不会自动确认。当消息被处理完成后,调用basicAck方法来手动确认消息。

2、消息持久化机制

要使消息持久化,你需要确保队列、消息以及交换机都是持久化的。

1、持久化队列和消息示例

java 复制代码
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class DurableProducer {
    private final static String QUEUE_NAME = "my_durable_queue";

    public static void main(String[] argv) 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!";
            // 设置消息的属性为持久化
            BasicProperties properties = new BasicProperties.Builder()
                .deliveryMode(2) // 设置为2表示消息是持久化的
                .build();

            channel.basicPublish("", QUEUE_NAME, properties, message.getBytes("UTF-8"));
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

在上面的生产者示例中,queueDeclare方法的第二个参数设置为true来创建持久化队列,而BasicProperties的deliveryMode设置为2来标记消息为持久化。

2、交换机持久化

对于交换机,如果你使用的是默认的直连交换机,那么它不需要特别声明为持久化的,因为直连交换机在RabbitMQ中是内置的,并且总是存在的。然而,如果你使用的是自定义的交换机类型(如topic或headers),并且想要它们持久化,那么需要在声明交换机时设置durable参数为true。

确保RabbitMQ服务器已配置为在重启时保留持久化数据(这通常是默认配置,但可能因安装和配置方式而异)。

请注意,持久化虽然提高了可靠性,但可能会降低性能,因为磁盘I/O操作通常比内存操作慢。因此,在设计系统时,应根据业务需求权衡可靠性与性能。

相关推荐
顺天gie4 分钟前
idea中提高编译速度研究
java·spring boot·intellij-idea
异常君29 分钟前
深入 JVM:线程池源码剖析与性能调优全攻略
java·jvm·后端
Light___mmm30 分钟前
注入Java Bean的方式
java
xcLeigh39 分钟前
HTML5好看的水果蔬菜在线商城网站源码系列模板4
java·前端·源码·html5
烛.照1031 小时前
RabbitMQ消息的可靠性
linux·docker·rabbitmq
smileNicky1 小时前
RabbitMQ架构原理及消息分发机制
分布式·架构·rabbitmq
noravinsc1 小时前
windows上rabbitmq服务激活后 15672无法打开
windows·分布式·rabbitmq
烟沙九洲1 小时前
算法的时间复杂度
java·算法
写bug写bug1 小时前
小小 Stream,一篇文章拿捏它
java·后端
写bug写bug1 小时前
好用的Lombok注解
java·后端