rabbitmq高階特性 訊息的可靠投遞
阿新 • • 發佈:2021-10-05
rabbitmq高階特性 訊息的可靠投遞
概念
confirm模式簡單使用
confirm模式會在訊息傳遞後執行一個回撥函式 通過回撥函式的值我們可以判斷是否正確投遞訊息給交換機
在boot整合rabbitmq基礎之後 編輯配置開啟confirm模式
spring:
rabbitmq:
host: 192.168.198.129
port: 5672
username: admin
password: admin
virtual-host: /
publisher-confirm-type: correlated
編寫回調函式
@Autowired RabbitTemplate rabbitTemplate; @Test void contextLoads() { rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { /** * * @param correlationData * @param ack 確認交換機是否收到訊息 * @param s 失敗原因 */ @Override public void confirm(CorrelationData correlationData, boolean ack, String s) { System.out.println("confirm方法被執行了"); if(ack){ System.out.println("接受成功 "+s); } else { System.out.println("接受失敗 "+s); } } }); rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"boot.haha","hello boot and mq"); }
執行程式可以得知訊息正確投遞了
修改交換機名字為一個不存在的名字
執行程式
可以看到回撥函式成功得知傳送失敗了
因此通過這種機制我們可以確保訊息是否成功投遞給交換機
return模式簡單使用
return模式:
交換機路由到佇列時,如果出現問題才會執行ReturnCallBack
開啟return模式也需要我們手動去配置
配置開啟return模式
spring: rabbitmq: host: 192.168.198.129 port: 5672 username: admin password: admin virtual-host: / publisher-confirm-type: correlated publisher-returns: true
預設為廢棄原則 即出現問題直接不鳥了 要手動改為執行回撥函式模式
rabbitTemplate.setMandatory(true);
編寫回調函式並測試使用
@Test void test2(){ //預設為廢棄原則 改為執行回撥函式原則 rabbitTemplate.setMandatory(true); rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() { @Override public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { System.out.println("執行了return方法"); } }); rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"boot22.haha","hello boot and mq"); }
這裡routingKey是錯誤的 所以程式執行會執行回撥函式
總結
confirm模式 確保了 broker到交換機訊息傳遞成功
return模式 確保了交換機到佇列訊息傳遞成功
兩者結合即可做到訊息可靠投遞