RabbitMQ-消息可靠投递-Confirm与Return
RabbitMQ消息投递路径:producer->rabbitmq broker->exchange->queue->consumer
消息从producer到exchange,返回一个ConfirmCallBack
消息从exchange到queue失败,返回一个ReturnCallBack
一、Confirm消息确认模式
/**
* confirm模式
* 步骤:1、ConnectionFactory中开启publisher-confirms="true"
* 2、定义ConfirmCallBack回调函数
*/
@Test
public void testConfirm(){
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback(){
/**
*
* @param correlationData 相关配置信息
* @param ack 交换机是否成功接收信息
* @param cause 接收信息失败原因
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.out.println("confirm方法被执行了...");
if(ack){
System.out.println("接收成功:"+cause);
}else {
System.out.println("接收失败:"+cause);
} }
});
rabbitTemplate.convertAndSend("exchange_confirm","confirm","message test confirm ... ");
}
二、Return消息回退模式
/**
* return模式
* 步骤:1、ConnectionFactory中开启publisher-returns="true"
* 2、定义ReturnCallBack回调函数
* 3、设置Exchange处理消息的模式:如果交换机处理消息到queue失败,默认丢弃消息
*/
@Test
public void testReturn(){
//设置Exchange处理消息的模式
rabbitTemplate.setMandatory(true);
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
/**
*
* @param message 消息对象
* @param replyCode 错误码
* @param replyText 错误信息
* @param exchange 交换机
* @param routingKey 路由键
*/
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println("return方法被执行了");
System.out.println(message);
System.out.println(replyCode);
System.out.println(replyText);
System.out.println(exchange);
System.out.println(routingKey);
}
});
rabbitTemplate.convertAndSend("exchange_confirm","confirm_1","message test return ...");
}