• RabbitMQ持久化


    概念

    我们已经看到了如何处理任务不丢失的情况(手动应答),但是如何保障当RabbitMQ服务停掉以后消息生产者发送过来的消息不丢失。默认情况下RabbitMQ退出或由于某种原因崩溃时,它忽视队列和消息,除非告知它不要这样做。确保消息不会丢失需要做两件事:我们需要将队列和消息都标记为持久化。

     队列如何实现持久化

    之前我们创建的队列都是非持久化的,rabbitmq如果重启的化,该队列就会被删除掉,如果 要队列实现持久化 需要在声明队列的时候把durable参数设置为持久化

    但是需要注意的就是如果之前声明的队列不是持久化的,需要把原先队列先删除,或者重新创建一个持久化的队列,不然就会出现错误

    以下为控制台中持久化与非持久化队列的UI显示区、

     

    这个时候即使重启rabbitmq队列也依然存在

    3.3.3. 消息实现持久化

    要想让消息实现持久化需要在消息生产者修改代码,MessageProperties.PERSISTENT_TEXT_PLAIN添加这个属性。

    1. /**
    2. * 持久化
    3. */
    4. public class Task02 {
    5. public static final String QUEUE_NAME="hello1";
    6. public static void main(String[] args) throws IOException, TimeoutException {
    7. Channel channel = untils.getChannel();
    8. boolean durable=true;
    9. //队列持久化
    10. channel.queueDeclare(QUEUE_NAME,durable,false,false,null);
    11. //从控制太中接受消息
    12. Scanner scanner = new Scanner(System.in);
    13. while(scanner.hasNext())
    14. {
    15. String message=scanner.next();
    16. //MessageProperties.PERSISTENT_TEXT_PLAIN 消息持久化参数
    17. channel.basicPublish("",QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes(StandardCharsets.UTF_8));;
    18. System.out.println("发送消息完成"+message);
    19. }
    20. }
    21. }

    将消息标记为持久化并不能完全保证不会丢失消息。

    尽管它告诉RabbitMQ将消息保存到磁盘,但是这里依然存在当消息刚准备存储在磁盘的时候 但是还没有存储完,消息还在缓存的一个间隔点。此时并没有真正写入磁盘。持久性保证并不强,但是对于我们的简单任务队列而言,这已经绰绰有余了。如果需要更强有力的持久化策略,参考发布确认。

  • 相关阅读:
    VB-14
    Ubuntu安装搜狗输入法
    vue自定义指令
    java毕业设计——基于java+Jsp+Tomcat的敬老院管理系统设计与实现(毕业论文+程序源码)——敬老院管理系统
    C/C++---------------LeetCode第349.两个数组的交集
    EdgeCloudSim官方Sample运行——Windows+IntelliJ IDEA+Matlab
    [OpenAI]继ChatGPT后发布的Sora模型原理与体验通道
    1024短信盲盒 | 暖心短信陪你过节,还有更多好礼
    第四章 使用Vitepress搭建文档网站
    LeetCode算法心得——和为k的子数组(前缀和+HashMap)
  • 原文地址:https://blog.csdn.net/m0_62436868/article/details/125866585