rabbitmq进阶:回调函数之确认(confirm)模式、回退(return)模式
程序员文章站
2022-06-28 17:26:39
一、确认(confirm)模式运用场景当生产方发送消息至交换机后的处理逻辑包括发送成功或者失败废话不多说,直接上代码开启确认模式spring: rabbitmq: host: localhost port: 5672 username: guest password: guest virtual-host: / listener: simple: acknowledge-mode: manual # 消费者...
一、确认(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 dugt1998@163.com
* @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类型转换异常
推荐阅读
本文地址:https://blog.csdn.net/weixin_44912855/article/details/110872819