RabbitMQ 高级特性

1.1 消息的可靠投递
在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。

confirm 确认模式
return 退回模式
rabbitmq 整个消息投递的路径为:

producer—>rabbitmq-broker—>exchange—>queue—>consumer

生产:消息从 producer 到 exchange 则会返回一个 confirmCallback()。都会执行,返回false就失败
内部:消息从 exchange–>queue 投递失败则会返回一个 returnCallback()。
我们将利用这两个 callback 控制消息的可靠性投递

 

<!-- 定义rabbitmq connectionFactory -->
<rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
port="${rabbitmq.port}"
username="${rabbitmq.username}"
password="${rabbitmq.password}"
virtual-host="${rabbitmq.virtual-host}"
publisher-confirms="true"
/>

 

@Autowired
private RabbitTemplate rabbitTemplate;

/**
* 确认模式:
* 步骤:
* 1. 确认模式开启:ConnectionFactory中开启publisher-confirms="true"
* 2. 在rabbitTemplate定义ConfirmCallBack回调函数
*/
@Test
public void testConfirm() {

//2. 定义回调
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
/**
* @param correlationData 相关配置信息
* @param ack exchange交换机 是否成功收到了消息。true 成功,false代表失败
* @param cause 失败原因
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (ack) { //接收成功
System.out.println("接收成功消息" + cause);
} else { //接收失败。如何失败:交换机等配置错误
System.out.println("接收失败消息" + cause);
//做一些处理,让消息再次发送。
}
}
});

//3. 发送消息
rabbitTemplate.convertAndSend("test_exchange_confirm111", "confirm", "message confirm....");
}

<!-- 定义rabbitmq connectionFactory -->
<rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
port="${rabbitmq.port}"
username="${rabbitmq.username}"
password="${rabbitmq.password}"
virtual-host="${rabbitmq.virtual-host}"
publisher-confirms="true"
publisher-returns="true"
/>

posted @ 2021-03-25 16:08  巧克力曲奇  阅读(73)  评论(0编辑  收藏  举报