如何保证消息不丢失
rabbitmq消息投递路径
生产者->交换机->队列->消费者
总的来说分为三个阶段。
- 1.生产者保证消息投递可靠性。
- 2.mq内部消息不丢失。
- 3.消费者消费成功。
什么是消息投递可靠性
简单点说就是消息百分百发送到消息队列中。
我们可以开启confirmCallback
生产者投递消息后,mq会给生产者一个ack.根据ack,生产者就可以确认这条消息是否发送到mq.
开启confirmCallback
修改配置文件
#NONE:禁用发布确认模式,是默认值,CORRELATED:发布消息成功到交换器后会触发回调方法
spring:
rabbitmq:
publisher-confirm-type: correlated
复制代码
测试代码
@Test
public void testConfirmCallback() throws InterruptedException {
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
/**
*
* @param correlationData 配置
* @param ack 交换机是否收到消息,true是成功,false是失败
* @param cause 失败的原因
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.out.println("confirm=====>");
System.out.println("confirm==== ack="+ack);
System.out.println("confirm==== cause="+cause);
//根据ACK状态做对应的消息更新操作 TODO
}
});
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"ikun.mei", "鸡你太美");
Thread.sleep(10000);
}
复制代码
通过returnCallback保证消息从交换器发送到队列成功。 修改配置文件
spring:
rabbitmq:
#开启returnCallback
publisher-returns: true
#交换机处理消息到路由失败,则会返回给生产者
template:
mandatory: true
复制代码
测试代码
@Test
void testReturnCallback() {
//为true,则交换机处理消息到路由失败,则会返回给生产者 配置文件指定,则这里不需指定
rabbitTemplate.setMandatory(true);
//开启强制消息投递(mandatory为设置为true),但消息未被路由至任何一个queue,