訊息佇列中的資料丟失怎麼辦

2021-09-19 20:36:40 字數 2903 閱讀 4606

rabbitmq

1、資料丟失的原因

2、針對丟失原因1的解決方式有兩種

一種是用mq的事務,但是有個缺點,是阻塞的,影響效能

try  catch (exception e)  finally
另一種是用confirm模式(優點,就是執行效率高,不需要等待訊息執行完,只需要監聽訊息即可)

方式一:channel.waitforconfirms()普通傳送方確認模式;

方式二:channel.waitforconfirmsordie()批量確認模式;

方式三:channel.addconfirmlistener()非同步監聽傳送方確認模式;

// 建立連線

connectionfactory factory = new connectionfactory();

factory.setusername(config.username);

factory.setpassword(config.password);

factory.setvirtualhost(config.vhost);

factory.sethost(config.host);

factory.setport(config.port);

connection conn = factory.newconnection();

// 建立通道

channel channel = conn.createchannel();

// 宣告佇列

channel.queuedeclare(config.queuename, false, false, false, null);

// 開啟傳送方確認模式

channel.confirmselect();

string message = string.format("時間 => %s", new date().gettime());

channel.basicpublish("", config.queuename, null, message.getbytes("utf-8"));

if (channel.waitforconfirms())

看**可以知道,我們只需要在推送訊息之前,channel.confirmselect()宣告開啟傳送方確認模式,再使用channel.waitforconfirms()等待訊息被伺服器確認即可。

// 建立連線

connectionfactory factory = new connectionfactory();

factory.setusername(config.username);

factory.setpassword(config.password);

factory.setvirtualhost(config.vhost);

factory.sethost(config.host);

factory.setport(config.port);

connection conn = factory.newconnection();

// 建立通道

channel channel = conn.createchannel();

// 宣告佇列

channel.queuedeclare(config.queuename, false, false, false, null);

// 開啟傳送方確認模式

channel.confirmselect();

for (int i = 0; i < 10; i++)

channel.waitforconfirmsordie(); //直到所有資訊都發布,只要有乙個未確認就會ioexception

system.out.println("全部執行完成");

以上**可以看出來channel.waitforconfirmsordie(),使用同步方式等所有的訊息傳送之後才會執行後面**,只要有乙個訊息未被確認就會丟擲ioexception異常。

// 建立連線

connectionfactory factory = new connectionfactory();

factory.setusername(config.username);

factory.setpassword(config.password);

factory.setvirtualhost(config.vhost);

factory.sethost(config.host);

factory.setport(config.port);

connection conn = factory.newconnection();

// 建立通道

channel channel = conn.createchannel();

// 宣告佇列

channel.queuedeclare(config.queuename, false, false, false, null);

// 開啟傳送方確認模式

channel.confirmselect();

for (int i = 0; i < 10; i++)

//非同步監聽確認和未確認的訊息

channel.addconfirmlistener(new confirmlistener()

@override

public void handleack(long deliverytag, boolean multiple) throws ioexception

});

訊息中介軟體 訊息丟失怎麼辦

如何保證訊息的可靠性傳輸?或者說,如何處理訊息丟失的問題?如果說你這個是用 mq 來傳遞非常核心的訊息,比如說計費 扣費的一些訊息,那必須確保這個 mq 傳遞過程中絕對不會把計費訊息給弄丟。訊息中介軟體各種面試題 訊息中介軟體面試題 訊息丟失怎麼辦?訊息中介軟體面試題 訊息佇列的優缺點,區別 訊息中...

提單丟失了,怎麼辦?

提單丟失後應如何應對?1.提單丟失後的第一反應就是聯絡貨代或者船公司,其實也應該通知一下收貨人。2.要在市級以上的報刊連續三天登報,宣告提單已經遺失。3.船公司會開具提單遺失保函,根據要求填寫提單號,箱封號等資訊,加蓋公章正本寄回船公司。4.最重要的乙個環節就是押金。提單丟失,船公司一般會要求押金是...

Linux中丟失grub檔案怎麼辦?

在linux中不小心刪除了grub檔案,會導致系統起不來,那我們怎麼解決這個問題呢?當然重灌可以解決,但是就丟失了這麼乙個檔案而重灌系統未免有些小題大做了吧!下面有乙個比較便捷的方法解決這個問題?首先我們要知道系統在開啟電源的那一刻,之後電腦都做了什麼 即系統的啟動流程 1.bios 初始化 2.啟...