• RabbitMQ中的手动应答和自动应答


    当使用RabbitMQ来处理消息时,消息确认是一个重要的概念。RabbitMQ提供了两种不同的消息确认方式:自动应答(Automatic Acknowledgment)和手动应答(Manual Acknowledgment)。这两种方式适用于不同的应用场景,本文将通过Java代码示例来演示它们的区别以及如何在实际应用中使用它们。

    自动应答(Automatic Acknowledgment)

    自动应答是一种简单的消息确认方式,它的特点是一旦消息被传递给消费者,就会立即被标记为已处理,并从队列中删除。这种方式适用于那些消息处理非常简单,且不容易出错的场景。

    以下是一个使用自动应答的Java示例代码:

    import com.rabbitmq.client.*;
    
    public class AutoAckConsumer {
        private final static String QUEUE_NAME = "auto_ack_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, false, false, false, null);
                System.out.println("Waiting for messages...");
    
                DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                    String message = new String(delivery.getBody(), "UTF-8");
                    System.out.println("Received: " + message);
                };
    
                channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
                
                // Messages will be auto-acknowledged (automatically removed from the queue).
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在上述代码中,我们使用channel.basicConsume启动了一个消费者,并将autoAck参数设置为true,这表示消息会在被传递给消费者后立即被标记为已处理。

    手动应答(Manual Acknowledgment)

    手动应答是一种更为灵活的消息确认方式。在这种方式下,消费者需要明确地确认消息的接收和处理,通常在成功处理消息后才进行确认。这种方式适用于需要确保消息不会丢失,以及需要处理可能失败的场景。

    以下是一个使用手动应答的Java示例代码:

    import com.rabbitmq.client.*;
    
    public class ManualAckConsumer {
        private final static String QUEUE_NAME = "manual_ack_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, false, false, false, null);
                System.out.println("Waiting for messages...");
    
                DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                    String message = new String(delivery.getBody(), "UTF-8");
                    System.out.println("Received: " + message);
    
                    // Simulate some processing
                    // For successful processing, acknowledge the message
                    // For failed processing, do not acknowledge the message
                    boolean successfulProcessing = true;
                    if (successfulProcessing) {
                        channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
                    } else {
                        // Message processing failed, requeue the message
                        channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, true);
                    }
                };
    
                channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> { });
                
                // Messages will not be auto-acknowledged, and you need to manually acknowledge or reject them.
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在上述代码中,我们同样使用了channel.basicConsume启动了一个消费者,但这次将autoAck参数设置为false,表示消息不会自动被确认。而是在消息成功处理后,使用channel.basicAck来手动确认消息,或者使用channel.basicNack来拒绝消息并将其重新排队,以便后续重新处理。

    结论

    在使用RabbitMQ时,消息确认方式的选择取决于您的应用场景。自动应答适用于简单的、不容易出错的情况,而手动应答适用于需要更多控制和可靠性的情况。在选择时,需要考虑您的应用程序的特定需求和可靠性要求。

    无论您选择哪种方式,RabbitMQ都为您提供了强大的消息传递功能,帮助您构建可靠的分布式系统。希望本文的示例代码对您有所帮助。如果您想了解更多关于RabbitMQ的内容,请查阅官方文档或其他教程资源。

  • 相关阅读:
    DBeaver下载安装与使用
    手写SDK的秘诀
    ARM开发流程LDS相关解惑
    瞄准物业采购痛难点,SRM供应商采购管理系统助力企业打造全数字化供应网络
    移动应用安全
    聊聊多模态大模型处理的思考
    【php毕业设计】基于php+mysql+apache的校园新闻网站设计与实现(毕业论文+程序源码)——校园新闻网站
    使用NNI对DLASeg剪枝的失败记录
    mybatis plus in使用时传数组、集合的注意点
    欧盟:苹果不许限制 iOS 中的浏览器引擎,网友:不怕 Chrome “垄断”市场?
  • 原文地址:https://blog.csdn.net/m0_51663233/article/details/133661790