RabbitMQ實現(xiàn)消息可靠性傳遞過程講解
目錄結構

導入依賴
<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 # 開啟確認回調
publisher-returns: true # 開啟退回回調
在publisher-confirm-type中有三個確認消息接受類型:none、correlated、simple。

publisher-confirm-type: none 表示禁用發(fā)布確認模式。是默認值。使用此模式之后,不管消息有沒有發(fā)送到Broker(RabbitMQ)都不會觸發(fā)ConfirmCallback回調。
publisher-confirm-type: correlated 表示消息成功到達Broker后觸發(fā)ConfirmCalllBack回調。
publisher-confirm-type: simple 表示如果消息成功到達Broker后一樣會觸發(fā)ConfirmCalllBack回調,發(fā)布消息成功后使用rabbitTemplate調用waitForConfirms()或waitForConfirmsOrDie()方法等待Broker節(jié)點返回發(fā)送結果,根據返回結果來判定下一步的邏輯。如果waitForConfirmsOrDie()方法如果返回false則會關閉channel信道,則接下來無法發(fā)送消息到Broker。
業(yè)務邏輯
@SpringBootTest
@RunWith(SpringRunner.class)
class RabbitmqProducerApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
void testProducer() {
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
//三個參數分別為:相關配置消息、交換機是否收到消息、未收到消息的原因
@Override
public void confirm(CorrelationData correlationData, boolean b, String s) {
if(b) System.out.println("交換機成功接受到了消息");
else System.out.println("消息失敗原因" + s);
}
});
// 設置交換機處理失敗消息的模式
// true:消息到達不了隊列時 會將消息重新返回給生產者 false:消息到達不了隊列直接丟棄(默認)
rabbitTemplate.setMandatory(true);
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
//五個參數分別為:消息對象、失敗狀態(tài)碼、失敗信息、交換機名稱、路由鍵
@Override
public void returnedMessage(Message message, int i, String s, String s1, String s2) {
System.out.println("隊列接受不到交換機的消息進行了失敗回調");
}
});
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"test.heHe","HelloWorld");
}
}測試結果
為了測試是否進行了確認回調方法即confirmCallBack()方法,我將上方的交換機名稱故意寫錯
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME + "1","test.heHe","HelloWorld");

為了測試是否進行了退回回調方法即returnCallBack()方法,我將上方的路由鍵名稱故意寫錯
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"t.heHe","HelloWorld");

總結
經上方兩次測試,可以使用ConfirmCallBack與ReturnCallBack來確認消息的可靠性傳遞。ConfirmCallBack是確認交換機是否可以成功接收到消息,而ReturnCallBack是確認隊列是否可以成功接收到交換機發(fā)來的消息。這是作為解決作為消息發(fā)送方希望杜絕任何消息丟失或者投遞失敗場景。 但需要注意的是在yml中必須添加兩行配置。
到此這篇關于RabbitMQ實現(xiàn)消息可靠性傳遞過程講解的文章就介紹到這了,更多相關RabbitMQ消息可靠性傳遞內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?boot事務無效報錯:Transaction?not?enabled問題排查解決
在業(yè)務代碼中經常需要保證事務的原子性,但是有的時候確實是出現(xiàn)事務沒有生效,這篇文章主要給大家介紹了關于Spring?boot事務無效報錯:Transaction?not?enabled問題排查的相關資料,需要的朋友可以參考下2023-11-11
SpringBoot中的@ControllerAdvice注解原理詳解
這篇文章主要介紹了SpringBoot中的@ControllerAdvice注解原理詳解,在SpringBoot應用程序啟動過程中,Spring會掃描所有的類,尋找?guī)в蠤ControllerAdvice注解的類這些方法會被添加到一個映射表中,以便后續(xù)處理異常時能找到對應的處理方法,需要的朋友可以參考下2024-01-01
Springboot+Mybatis中typeAliasesPackage正則掃描實現(xiàn)方式
這篇文章主要介紹了Springboot+Mybatis中typeAliasesPackage正則掃描實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Java開發(fā)環(huán)境配置教程(win7 64bit)
這篇文章主要為大家詳細介紹了win7 64bit下Java開發(fā)環(huán)境的配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08

