12.RabbitMQ消息Confirm模式
12.1 Confirm模式简介
消息的confirm确认机制,是指生产者投递消息后,到达了消息服务器Broker里面的exchange交换机,则会给生产者一个应答,生产者接收到应答,用来确定这条消息是否正常的发送到Broker的exchange中,这也是消息可靠性投递的重要保障;
12.2 具体代码设置
1 配置文件application.yml 开启确认模式:spring.rabbitmq.publisher-confirm-type=_correlated_2 写一个类实现implements RabbitTemplate.ConfirmCallback,判断成功和失败的ack结果,可以根据具体的结果,如果ack为false,对消息进行重新发送或记录日志等处理;设置rabbitTemplate的确认回调方法3 rabbitTemplate.setConfirmCallback(messageConfirmCallBack); |
---|
参考代码:
| @Component
public class MessageConfirmCallBack implements RabbitTemplate.ConfirmCallback {
/**
* 交换机收到消息后,会回调该方法
*
* @param correlationData 相关联的数据
* @param ack 有两个取值,true和false,true表示成功:消息正确地到达交换机,反之false就是消息没有正确地到达交换机
* @param cause 消息没有正确地到达交换机的原因是什么
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.out.println("correlationData = " + correlationData);
System.out.println("ack = " + ack);
System.out.println("cause = " + cause);
if (ack) {
//正常
} else {
//不正常的,可能需要记日志或重新发送
}
}
} |
---|
发消息参考代码
| @Service
public class MessageService {
@Resource
private RabbitTemplate rabbitTemplate;
@Resource
private MessageConfirmCallBack messageConfirmCallBack;
@PostConstruct //bean在初始化的时候,会调用一次该方法,只调用一次,起到初始化的作用
public void init() {
rabbitTemplate.setConfirmCallback(messageConfirmCallBack);
}
/**
* 发送消息
*/
public void sendMessage() {
//关联数据对象
CorrelationData correlationData = new CorrelationData();
correlationData.setId(“O159899323”); //比如设置一个订单ID,到时候在confirm回调里面,你就可以知道是哪个订单没有发送到交换机上去
rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE + 123, “info”, “hello”, correlationData);
System.out.println(“消息发送完毕…”);
}
}
|
| — |
两个示例:可以在发消息时直接实现接口
13. RabbitMQ消息Return模式
rabbitmq 整个消息投递的路径为:
producer —> exchange —> queue —> consumer
消息从 producer 到 exchange 则会返回一个 confirmCallback;
消息从 exchange –> queue 投递失败则会返回一个 returnCallback;
我们可以利用这两个callback控制消息的可靠性投递;
开启 确认模式;
使用rabbitTemplate.setConfirmCallback设置回调函数,当消息发送到exchange后回调confirm方法。在方法中判断ack,如果为true,则发送成功,如果为false,则发送失败,需要处理;
注意配置文件中,开启 退回模式;
spring.rabbitmq.publisher-returns: true |
---|
使用rabbitTemplate.setReturnCallback设置退回函数,当消息从exchange路由到
queue失败后,则会将消息退回给producer,并执行回调函数returnedMessage;
|
@Component
public class MessageReturnCallBack implements RabbitTemplate.ReturnsCallback {
/**
* 当消息从交换机 没有正确地 到达队列,则会触发该方法
* 如果消息从交换机 正确地 到达队列了,那么就不会触发该方法
*
* @param returned
*/
@Override
public void returnedMessage(ReturnedMessage returned) {
System.out.println(“消息return模式:” + returned);
}
} |
---|
参考发送代码
| @Service
public class MessageService {
@Resource
private RabbitTemplate rabbitTemplate;
@Resource
private MessageReturnCallBack messageReturnCallBack;
@PostConstruct //bean在初始化的时候,会调用一次该方法,只调用一次,起到初始化的作用
public void init() {
rabbitTemplate.setReturnsCallback(messageReturnCallBack);
}
/**
* 发送消息
*/
public void sendMessage() {
rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE, “info123”, “hello”);
System.out.println(“消息发送完毕…”);
}
}
|
| — |
代码