1. 程式人生 > >RabbitMQ之Falldisc(持久化)

RabbitMQ之Falldisc(持久化)

RabbitMQ的訊息佇列是駐留記憶體的, 萬一機器Down機的話, 記憶體裡的佇列, 也會消失不見. 為解決這個問題, 才有了”持久化” 這個概念.
顧名思義: 將訊息佇列存到硬碟上(落盤)的檔案中, 勢必會影響效率

訊息實體

package com.yuchen.demo.falldisc;

import java.io.Serializable;

public class Message implements Serializable {

    private static final long serialVersionUID = 1L;
    String xxx;

    public
Message(String xxx) { this.xxx = xxx; } public String getXxx() { return xxx; } public void setXxx(String xxx) { this.xxx = xxx; } @Override public String toString() { return this.xxx; } }

生產者

package com.yuchen.demo.falldisc;
import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.MessageProperties; public class Send { // 佇列名稱 private final static String QUEUE_NAME = "lsy_falldisc"
; public static void main(String[] args) throws Exception { // 建立連線連線到MabbitMQ ConnectionFactory factory = new ConnectionFactory(); factory.setHost("10.13.144.24"); factory.setVirtualHost("/"); factory.setPort(5672); factory.setUsername("admin"); factory.setPassword("admin"); // 新建連線 Connection connection = factory.newConnection(); // 建立通道 Channel channel = connection.createChannel(); // 建立佇列 (佇列名稱, 持久化, 僅有1個consumer 與autoDelete配合使用 沒有consumer自動刪除 , 自動刪除, 其他引數) channel.queueDeclare(QUEUE_NAME, true, false, false, null); // 傳送訊息 byte[] // 使用者可以把自己的訊息序列化成JSON等格式在轉成byte[]傳送到佇列中取出訊息後再反序列化得到訊息內容 Message message = new Message("Hello Message !"); // 訊息持久化 MessageProperties.PERSISTENT_TEXT_PLAIN ByteArrayOutputStream baos = new ByteArrayOutputStream(10000); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(message); channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, baos.toByteArray()); System.out.println("傳送成功: '" + message + "'"); // 關閉連線 channel.close(); connection.close(); } }

消費者

package com.yuchen.demo.falldisc;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class MessageConsumer {

    // 佇列名稱
    private final static String QUEUE_NAME = "message_falldisc";

    public static void start() throws Exception {

        // 建立連線連線到MabbitMQ
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("10.13.144.24");
        factory.setVirtualHost("/");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
        // 新建連線
        Connection connection = factory.newConnection();
        // 建立通道
        Channel channel = connection.createChannel();

        // 宣告佇列, 可能在傳送方之前啟動接收方, 確保佇列存在。
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                ByteArrayInputStream bais = new ByteArrayInputStream(body);
                ObjectInputStream ois = new ObjectInputStream(bais);
                Message message = null;
                try {
                    message = (Message) ois.readObject();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                System.out.println("接收到遠端訊息: '" + message.toString() + "'");
            }
        };
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }

}

重點在於
佇列要持久化(第二個引數 true)

    channel.queueDeclare(QUEUE_NAME, true, false, false, null);
訊息也要持久化(第三個引數MessageProperties.PERSISTENT_TEXT_PLAIN)
channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, baos.toByteArray());

相關推薦

RabbitMQFalldisc(持久化)

RabbitMQ的訊息佇列是駐留記憶體的, 萬一機器Down機的話, 記憶體裡的佇列, 也會消失不見. 為解決這個問題, 才有了”持久化” 這個概念. 顧名思義: 將訊息佇列存到硬碟上(落盤)的檔案中

RabbitMQ訊息持久化(轉)

原文地址 https://blog.csdn.net/u013256816/article/details/60875666/   訊息的可靠性是RabbitMQ的一大特色,那麼RabbitMQ是如何保證訊息可靠性的呢——訊息持久化。 為了保證RabbitMQ在退出或者crash等異常

RabbitMQ訊息持久化(佇列持久化、訊息持久化)

訊息的可靠性是RabbitMQ的一大特色,那麼RabbitMQ是如何保證訊息可靠性的呢——訊息持久化。  為了保證RabbitMQ在退出或者crash等異常情況下資料沒有丟失,需要將queue,exchange和Message都持久化。 queue的持久化 queue

第五章:Python RabbitMQ消息持久化

rabbitmq#測試RabbitMQ消息永久化 #1. 分隊列永久化和信息永久化 #2. 意思為當服務重啟後,隊列和消息還存在,可供客戶端接受 #3. 在服務器查看消息隊列命令./rabbitmqctl list_queues #send 端 import pika credentials = pik

RabbitMQ佇列與訊息持久化

佇列持久化 在之前的例子中,我們所用的佇列都是臨時佇列,當服務重啟後之前建立的佇列就都沒有了。 佇列的持久化是在定義佇列時的第二個引數決定的(false為佇列不用持久化) channel.queueDeclare(queueName, false, false

RabbitMQ學習筆記五:RabbitMQ優先級消息隊列

-c virtual 調用 itl 3.5 rri color images 執行順序 RabbitMQ優先級隊列註意點: 1、只有當消費者不足,不能及時進行消費的情況下,優先級隊列才會生效 2、RabbitMQ3.5以後才支持優先級隊列 代碼在博客:RabbitMQ學習筆

細說Tomcatsession持久化探秘

分享 我們 級別 業務 這樣的 再次 感到 cal 正常 業務場景:通常,我們會在會話級別存放一些參數,期望在session生命周期內,可以一直取得保存在session中的指定數據;而只要session過期或者失效,則需要執行重新登錄等操作。但是!我們對於這樣的場景會感到很

Tomcat session 持久化1

ajp 管理 dma element his upm 十月 amp exceptio Tomcat 之session 持久化原理 幾個概念: Manager 接口,其實就是指的是對 其Sesison 的管理, 其默認實現是StandardManager (內部沒有任何

RabbitMQ消費者Demo(隊列參數詳細說明)

per don create pac col div icp rod 忽略 1 package com.jiefupay; 2 3 import java.io.IOException; 4 import java.util.HashMap; 5 i

Rabbitmq消息持久化

配置 timeout 進程 gray 產生 let 還需 建立 simple 消息的可靠性是RabbitMQ的一大特色,那麽RabbitMQ是如何保證消息可靠性的呢——消息持久化。?為了保證RabbitMQ在退出或者crash等異常情況下數據沒有丟失,需要將queue,ex

Java使用RabbitMQ公平分發

env 接受 col java catch conn ech exceptio don 發送消息: 1 package org.study.workfair; 2 3 import com.rabbitmq.client.Channel; 4 import co

Java使用RabbitMQ整合Spring(生產者)

獲取 消息 org str 依賴 chang import name 5.1 依賴包 <!--RabbitMQ集成spring--> <!-- https://mvnrepository.com/artifact/org

SpringBoot整合RabbitMQ發送接收消息實戰

container 會同 prope spring 註解 流行 pin public lin 實戰前言 前幾篇文章中,我們介紹了SpringBoot整合RabbitMQ的配置以及實戰了Spring的事件驅動模型,這兩篇文章對於我們後續實戰RabbitMQ其他知識要點將起到奠

redis Redis持久化配置

持久 mes dbf ESS -m 解決 所有 lena 檢驗 Redis持久化配置 Redis的持久化有2種方式 1快照 2是日誌 Rdb快照的配置選項 save 900 1 // 900內,有1條寫入,則產生快照 save 300 1000

SpringBoot整合RabbitMQ典型應用場景實戰二

factor aid 分享圖片 actor esp rem 排隊 stc tps 實戰前言RabbitMQ 作為目前應用相當廣泛的消息中間件,在企業級應用、微服務應用中充當著重要的角色。特別是在一些典型的應用場景以及業務模塊中具有重要的作用,比如業務服務模塊解耦、異步通信、

SpringBoot整合RabbitMQ典型應用場景實戰三

分布 boot 自動刪除 blog jce 地址 這樣的 實施 微服務 實戰前言RabbitMQ 作為目前應用相當廣泛的消息中間件,在企業級應用、微服務應用中充當著重要的角色。特別是在一些典型的應用場景以及業務模塊中具有重要的作用,比如業務服務模塊解耦、異步通信、高並發限流

RabbitMQwin下安裝

1、安裝前準備 RabbitMQ 是建立在強大的Erlang OTP平臺上,因此安裝RabbitMQ之前要先安裝Erlang。 erlang:http://www.erlang.org/download.html rabbitmq:http://www.rabbitmq.com/down

進階的Redis資料持久化RDB與AOF

大家都知道,Redis之所以效能好,讀寫快,是因為Redis是一個記憶體資料庫,它的操作都幾乎基於記憶體。但是記憶體型資料庫有一個很大的弊端,就是當資料庫程序崩潰或系統重啟的時候,如果記憶體資料不儲存的話,裡面的資料就會丟失不見了。這樣的資料庫並不是一個可靠的資料庫。 所以資料的持久化是記憶體型資料庫的重中

SpringBoot整合RabbitMQ 典型應用場景實戰二

實戰前言 RabbitMQ 作為目前應用相當廣泛的訊息中介軟體,在企業級應用、微服務應用中充當著重要的角色。特別是在一些典型的應用場景以及業務模組中具有重要的作用,比如業務服務模組解耦、非同步通訊、高併發限流、超時業務、資料延遲處理等。上一篇博文我分享了RabbitMQ在業務服務模組解耦,非

SpringBoot整合RabbitMQ 典型應用場景實戰一

實戰前言 RabbitMQ 作為目前應用相當廣泛的訊息中介軟體,在企業級應用、微服務應用中充當著重要的角色。特別是在一些典型的應用場景以及業務模組中具有重要的作用,比如業務服務模組解耦、非同步通訊、高併發限流、超時業務、資料延遲處理等。 RabbitMQ 官網拜讀 首先,讓我們先拜讀