消息可靠性
什么是消息的可靠性呢??
简单来说就是 你的消息发放给 exchange 这个过程中 有可能丢失或者失败
这时候需要一个回调机制来监控 发送结果 必要时还要返回信息。
rabbitmq 给我们提供了两种:
首先是生产者到exchange发送过程的监控 ——confirm
然后是exchange到queue发送过程的监控 ——return
2种现在我们依次来代码实践一下:
- confirm
首先 在配置里面加一个 publisher-confirms: true
spring:
rabbitmq:
host: 192.168.88.151
username: guest
password: guest
virtual-host: /
port: 5672
publisher-confirms: true
然后java代码是这样:
@Test
public void testSend(){
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
//注意这是一个回调方法 等发送完成之后 再调用确认
/**
*
* @param correlationData 配置信息
* @param b adc 代表了exchange是否收到了信息
* @param s
*/
@Override
public void confirm(CorrelationData correlationData, boolean b, String s) {
System.out.println("伟伟 confirm方法被执行了");
if (b){
System.out.println("交换机接受成功"+s);
}else{
System.out.println("交换机接受失败"+s);
}
}
});
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"boot.maru","boot mq hello aaa");
}
看一下这个代码:
rabbitTemplate.setConfirmCallback()我们调用了这个方法,在里面用匿名内部类:(新手不懂匿名内部类的看这篇:)
来调用confirm方法 里面的第二个参数boolean 就是标志是否成功
- return
/**
*
* Return 模式
* 监控exchange到queue过程 失败则调用returnCallback
*/
@Test
public void testReturn(){
rabbitTemplate.setMandatory(true);
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback(){
@Override
public void returnedMessage(Message message, int i, String s, String s1, String s2) {
System.out.println("return 执行了");
}
});
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"boot.maru","boot mq hello aaa");
}