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模式 确保了交换机到队列消息传递成功
两者结合即可做到消息可靠投递

浙公网安备 33010602011771号