????在使用 RabbitMQ 的時(shí)候,可以通過(guò)消息持久化操作來(lái)解決因?yàn)榉?wù)器的異常崩潰而導(dǎo)致的消息丟失,除此之外,我們還會(huì)遇到一個(gè)問(wèn)題,當(dāng)消息的生產(chǎn)者將消息發(fā)送出去之后,消息到底有沒有正確地到達(dá)服務(wù)器呢?如果不進(jìn)行特殊配置,默認(rèn)情況下發(fā)送消息的操作是不會(huì)返回任何信息給生產(chǎn)者的,也就是默認(rèn)情況下生產(chǎn)者是不知道消息有沒有正確地到達(dá)服務(wù)器。如果在消息到達(dá)服務(wù)器之前已經(jīng)丟失,持久化操作也解決不了這個(gè)問(wèn)題,因?yàn)橄⒏緵]有到達(dá)服務(wù)器,何談持久化?
????RabbitMQ針對(duì)這個(gè)問(wèn)題,提供了兩種解決方式∶
????1.通過(guò)事務(wù)機(jī)制實(shí)現(xiàn);
????2.通過(guò)發(fā)送方確認(rèn)機(jī)制實(shí)現(xiàn)。
事務(wù)機(jī)制
事務(wù)相關(guān)的方法:channel.txSelect channel.txCommit channel.txRollback
channel.txSelect 是將信道設(shè)置成事務(wù)模式,
channel.txCommit 用來(lái)提交事務(wù)
channel.txRollback 用來(lái)回滾事務(wù)
事務(wù)正常提交
channel.txSelect();
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, false, MessageProperties.PERSISTENT_TEXT_PLAIN,"message".getBytes());
channel.txCommit();

事務(wù)回滾
try {
channel.txSelect();
channel.basicPublish(exchange,routingKey,MessageProperties.PERSISTENT_TEXT_PLAIN,msg.getBytes());
int result = 1 / 0;
channel.txCommit();
} catch (Exception e) {
e.printStackTrace();
channel.txRollback();
}

????使用事務(wù)機(jī)制會(huì)大幅降低RabbitMQ的性能,通過(guò)上圖可以看到使用事務(wù)會(huì)比不用事務(wù)多一些發(fā)送請(qǐng)求和恢復(fù)OK的操作。