• RabbitMQ 如何保证消息不丢失


    1. 开启消息确认机制:

      在发布消息时,可以设置deliveryMode为2(持久化),以确保消息不会因为RabbitMQ的崩溃而丢失。

    2. 使队列持久化:

      通过设置durabletrue,可以确保队列在RabbitMQ重启后依然存在。

    3. 使消费者确认机制:

      启用手动确认模式,并在消费完消息后手动确认。

    4. 以下是使用Java和Spring AMQP的示例代码:

    1. @Bean
    2. public Queue myQueue() {
    3. return QueueBuilder.durable("myQueue").build();
    4. }
    5. @Bean
    6. public DirectExchange myExchange() {
    7. return new DirectExchange("myExchange");
    8. }
    9. @Bean
    10. public Binding myBinding() {
    11. return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey");
    12. }
    13. @Bean
    14. public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
    15. SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    16. container.setConnectionFactory(connectionFactory);
    17. container.setQueueNames("myQueue");
    18. container.setMessageListener(listenerAdapter);
    19. container.setAcknowledgeMode(AcknowledgeMode.MANUAL); // 手动确认模式
    20. return container;
    21. }
    22. @Bean
    23. public MessageListenerAdapter listenerAdapter(MyConsumer myConsumer) {
    24. return new MessageListenerAdapter(myConsumer, "handleMessage");
    25. }
    26. public class MyConsumer {
    27. public void handleMessage(Message message) {
    28. // 处理消息
    29. // ...
    30. // 确认消息
    31. channel.basicAck(envelope.getDeliveryTag(), false);
    32. }
    33. }

    在发送消息时:

    1. rabbitTemplate.convertAndSend("myExchange", "myRoutingKey", message, message -> {
    2. message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); // 设置消息持久化
    3. return message;
    4. });

    确保你的消费者在处理完消息后调用basicAck来确认消息,这样即使消费者崩溃,未确认的消息也会被重新传递给另一个消费者。如果你希望在消费者异常时自动重新将消息放回队列,可以在handleMessage方法中捕获异常,并在异常处理逻辑中调用basicNackbasicReject方法,并设置重回队列的参数。

  • 相关阅读:
    selenium如何访问没有证书的网页
    leetcode-28. 实现 strStr()-20220829-KMP算法
    Mysql索引
    【Javascript】设计模式之单例模式
    跳表和散列表
    Pytorch之ResNet图像分类
    DHCP原理与配置
    Java客户端_zkclient库操作Zookeeper
    数据通信与网络(二)
    【编程题】【Scratch四级】2022.06 判断闰年
  • 原文地址:https://blog.csdn.net/nandao158/article/details/139313323