rabbitmq進階:回撥函式之確認(confirm)模式、回退(return)模式
阿新 • • 發佈:2020-12-10
一、確認(confirm)模式
運用場景
當生產者傳送訊息至交換機後的 成功或失敗 所處理的業務
廢話不多說,直接上程式碼
開啟確認模式
spring: rabbitmq: host: localhost port: 5672 username: guest password: guest virtual-host: / listener: simple: acknowledge-mode: manual # 消費者手動確認訊息 publisher-confirm-type: correlated # 確認模式 confirm
@Test void contextLoads() { rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { /** * @param correlationData 相關配置資訊 * @param ack 交換機是否收到訊息 * @param cause 失敗的原因 */ @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { if (ack) { // TODO 傳送成功後的業務邏輯 System.out.println("訊息傳送成功"); } else { System.out.println("訊息傳送失敗"); System.out.println("失敗原因" + cause); // TODO 傳送失敗後的業務處理 } } }); rabbitTemplate.convertAndSend("test.topic", "topic.order", "hello mq"); }
測試:
二、回退(return)模式
概念
當生產方傳送給交換機後,而交換機傳遞給佇列失敗時,才會進行相應的業務處理
yml中
spring:
rabbitmq:
publisher-returns: true # 回退模式
測試:
建立一個消費者,接受訊息的引數型別為Integer
/** * @author [email protected] * @date 2020/12/8 14:41 */ @Component public class Test { @RabbitHandler @RabbitListener(queues = "topic.order") public void testHandler(Integer integer, Message message, Channel channel) throws IOException { System.out.println(integer); channel.basicAck(message.getMessageProperties().getDeliveryTag(),false); } }
生產者:傳送一個String型別的資料,此時消費者會報錯,引數型別不匹配
@Test
void contextLoads() {
rabbitTemplate.setMandatory(true); // 設定強制標誌 僅適用於回退模式
rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
@Override
public void returnedMessage(ReturnedMessage returned) {
System.out.println(returned.getMessage());
}
});
rabbitTemplate.convertAndSend("test.topic", "topic.order", "aa");
}
結果:NumberFormatException型別轉換異常
推薦閱讀