RabbitMQ實現(xiàn)消息可靠性傳遞過程講解
目錄結(jié)構(gòu)
導(dǎo)入依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
修改yml
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
publisher-confirm-type: correlated # 開啟確認(rèn)回調(diào)
publisher-returns: true # 開啟退回回調(diào)
在publisher-confirm-type中有三個確認(rèn)消息接受類型:none、correlated、simple。
publisher-confirm-type: none 表示禁用發(fā)布確認(rèn)模式。是默認(rèn)值。使用此模式之后,不管消息有沒有發(fā)送到Broker(RabbitMQ)都不會觸發(fā)ConfirmCallback回調(diào)。
publisher-confirm-type: correlated 表示消息成功到達(dá)Broker后觸發(fā)ConfirmCalllBack回調(diào)。
publisher-confirm-type: simple 表示如果消息成功到達(dá)Broker后一樣會觸發(fā)ConfirmCalllBack回調(diào),發(fā)布消息成功后使用rabbitTemplate調(diào)用waitForConfirms()或waitForConfirmsOrDie()方法等待Broker節(jié)點返回發(fā)送結(jié)果,根據(jù)返回結(jié)果來判定下一步的邏輯。如果waitForConfirmsOrDie()方法如果返回false則會關(guān)閉channel信道,則接下來無法發(fā)送消息到Broker。
業(yè)務(wù)邏輯
@SpringBootTest @RunWith(SpringRunner.class) class RabbitmqProducerApplicationTests { @Autowired private RabbitTemplate rabbitTemplate; @Test void testProducer() { rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { //三個參數(shù)分別為:相關(guān)配置消息、交換機是否收到消息、未收到消息的原因 @Override public void confirm(CorrelationData correlationData, boolean b, String s) { if(b) System.out.println("交換機成功接受到了消息"); else System.out.println("消息失敗原因" + s); } }); // 設(shè)置交換機處理失敗消息的模式 // true:消息到達(dá)不了隊列時 會將消息重新返回給生產(chǎn)者 false:消息到達(dá)不了隊列直接丟棄(默認(rèn)) rabbitTemplate.setMandatory(true); rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() { //五個參數(shù)分別為:消息對象、失敗狀態(tài)碼、失敗信息、交換機名稱、路由鍵 @Override public void returnedMessage(Message message, int i, String s, String s1, String s2) { System.out.println("隊列接受不到交換機的消息進(jìn)行了失敗回調(diào)"); } }); rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"test.heHe","HelloWorld"); } }
測試結(jié)果
為了測試是否進(jìn)行了確認(rèn)回調(diào)方法即confirmCallBack()方法,我將上方的交換機名稱故意寫錯
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME + "1","test.heHe","HelloWorld");
為了測試是否進(jìn)行了退回回調(diào)方法即returnCallBack()方法,我將上方的路由鍵名稱故意寫錯
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"t.heHe","HelloWorld");
總結(jié)
經(jīng)上方兩次測試,可以使用ConfirmCallBack與ReturnCallBack來確認(rèn)消息的可靠性傳遞。ConfirmCallBack是確認(rèn)交換機是否可以成功接收到消息,而ReturnCallBack是確認(rèn)隊列是否可以成功接收到交換機發(fā)來的消息。這是作為解決作為消息發(fā)送方希望杜絕任何消息丟失或者投遞失敗場景。 但需要注意的是在yml中必須添加兩行配置。
到此這篇關(guān)于RabbitMQ實現(xiàn)消息可靠性傳遞過程講解的文章就介紹到這了,更多相關(guān)RabbitMQ消息可靠性傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC的處理器適配器-HandlerAdapter的用法及說明
這篇文章主要介紹了SpringMVC的處理器適配器-HandlerAdapter的用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12jenkins按模塊進(jìn)行構(gòu)建遇到的問題及解決方案
這篇文章主要介紹了jenkins按模塊進(jìn)行構(gòu)建的問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05深入淺析Spring Security5中默認(rèn)密碼編碼器
這篇文章主要介紹了Spring Security5中默認(rèn)密碼編碼器,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-05-05SpringBoot2.0+阿里巴巴Sentinel動態(tài)限流實戰(zhàn)(附源碼)
這篇文章主要介紹了SpringBoot2.0+阿里巴巴Sentinel動態(tài)限流實戰(zhàn)(附源碼),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11IntelliJ IDEA引入第三方j(luò)ar包或查看Java源碼的時候報decompiled.class file byt
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA引入第三方j(luò)ar包或查看Java源碼的時候報decompiled.class file bytecode version:52.0(java 8)錯誤的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10Spring Boot延遲執(zhí)行實現(xiàn)方法
本文介紹了在Spring Boot項目中延遲執(zhí)行方法的實現(xiàn),以及延遲執(zhí)行下聲明式事務(wù)和編程式事務(wù)的使用情況,感興趣的朋友一起看看吧2020-12-12