引言:
自我们安装好rabbitmq之时,系统默认生产者与消费者发布消费机制为自动模式,也就是说无需我们知道是否成功,即发布方法调取之后,消费者无异常后,整个流程完毕,但由于我们业务当中,由于网络波动或服务异常,消息有可能未成功被处理,这就需要我们确保消息真的到达了队列,或真的被消费成功,此文章将为大家讲解如何确定发布者将消息是否到达了交换机或队列
本次我们采用rabbitTemplate方式发送
rabbitmq发布确认有三种方式:
- 单独发布消息:同步等待确认,简单,但吞吐量非常有限
- 批量发布消息:批量同步等待确认,简单,合理的吞吐量,一旦出现问题但很难推断出是哪条消息出现了问题。
- 异步处理:最佳性能和资源利用,在出现错误的情况下可以很好地控制,但是实现起来稍微复杂一些。
一、yml文件添加如下:
# spring
spring:
#配置rabbitMq 服务器
rabbitmq:
host: 127.0.0.1
port: 5672
username: test
password: test
publisher-confirm-type: correlated // 此处为新加
二、代码实现:
- 单独发布消息
boolean flag = Boolean.TRUE.equals(rabbitTemplate.invoke(operations -> {
rabbitTemplate.convertAndSend("exchage", "routingkey", "消息体");
return rabbitTemplate.waitForConfirms(1000);
}));
if(flag){
System.out.println("收到消息!");
}
单独发布采用waitForConfirms(1000)方法来同步接收确认结果,如在指定时间内未确认发布成功则抛出异常,如发布消息失败则返回false,成功为true
- 批量发布消息
for(int i = 0; i < 10; i++){
rabbitTemplate.convertAndSend("exchage", "routingkey", "消息体");
}
if(flag){
System.out.println("Broker已经收到消息!");
}
批量发布与单独发布无异,只是发布一批消息后再确定
- 异步回调发布消息
// 设置消息回调,一个rabbitTemplate实例只能设置一次
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (ack) {
log.debug("接收消息成功,订单号:{}", correlationData.getId());
} else {
log.error("接收消息失败,订单号:{},原因:{}", correlationData.getId(), cause);
}
}
});
// 发布消息
CorrelationData correlationData = new CorrelationData(id);
rabbitTemplate.convertAndSend("exchage", "routingkey", "消息体", correlationData);
异步发送即确定是是否被发送到了交换机,成功或失败均会在回调方法显示,大大提高了效率,推荐使用
此次教程就先讲到这里,还有一种回调是ReturnCallback,代表消息是否成功送达到queue,我们下回分解~