这是一些高级的内容。
RabbitMQ还是运行在网络上的,倘若遇到了网络故障,mq自己挂了,出异常了,都会造成最终状态不一致的问题。这就是可靠性问题。
可靠性:一个消息发送出去之后,至少被消费1次。
要解决这3个问题
生产者连不上mq了,此时发送直接失败。因此有了失败重连。

它会影响失败时候的性能,因为mq主打不等,所以生产环境建议禁用。
生产者开启确认机制后,MQ收到消息后,会返回消息给生产者
有同步和异步两个方法

先配置
@Configuration
public class MqConfig implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);
rabbitTemplate.setReturnsCallback(new ReturnsCallback() {
@Override
public void returnedMessage(ReturnedMessage returned) {
log.debug("收到消息的return callback");
}
});
}
}
@Test
void testConfirm() throws InterruptedException {
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
correlationData.getFuture()
.addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {
@Override
public void onFailure(Throwable ex) {
log.error("消息回调失败", ex);
}
@Override
public void onSuccess(Confirm result) {
log.debug("收到回执");
if (result.isAck()) {
log.debug("成功");
} else {
log.debug("失败");
}
}
});
rabbitTemplate.convertAndSend("hmall.direct11", "blue11", "hello",correlationData);
Thread.sleep(2000);
}
情况总结:
注意nack是由 result.isAck() 为false返回出来的,要关注这个选项。生产者确认有网络开销,建议不开启。要开,publisher-return 开这个就可以了。
消息发给mq,但是mq自己挂了,那么消息就丢失了。
或者mq内存空间有限,消息积压,引发mq阻塞。 mq在太满的时候,会把消息存到硬盘上,这个过程是阻塞的过程。
mq3.6之前用数据持久化解决
消费者是否成功处理消息,得有一个回执,告诉到底是处理成功了,还是失败了。