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.啟...