0
点赞
收藏
分享

微信扫一扫

SpringAMQP对RabbitMQ消息的确认


SpringAMQP对RabbitMQ消息的确认

  • ​​发送者确认​​
  • ​​发送者回执​​

此文的案例基础在上文基础上改造。上文​​SpringBoot整合RabbitMQ​​ 本篇主要实现一个对生产者发送消息的确认。也就是当我们的生产者发送消息后,消费者这里是否有正确的接收等等,以及对于消息的反馈。

简单的说就是一个对消息的处理方案。
下面我们介绍两个方案。

发送者确认

发送者确认就是publisher-confirm,这个方案主要在交换机这里进行处理。
具体的处理逻辑呢,直接就开始用代码去演示好了。

首先我们需要开启这个发送者确认,我们需要在yml文件中配置

publisher-confirm-type: correlated #开启确认模式

SpringAMQP对RabbitMQ消息的确认_rabbitmq


然后我们在测试类里面这样去写,写这样的一个测试方法

/**
* 在yml配置文件当中开启去人模式
* 在RabbitTemplate定义ConfirmCallBack回调函数
*/
@Test
public void testConfirm()
{
//定义回调
template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
/**
*
* @param correlationData convertAndSend相关的配置信息,该方法有重载。所以会有一些不同参数
* @param b 代表交换机是否成功收到了消息,true代表成功,false代表失败
* @param s 代表失败的原因
*/
@Override
public void confirm(CorrelationData correlationData, boolean b, String s) {
System.out.println(b);

System.out.println("confirm 方法被执行了");
if(!b)
{
//接收成功
System.out.println("消息成功接收");

}else {
System.out.println("消息接受失败,"+s);

}
}
});
//发送一条消息
template.convertAndSend(RabbitConfig.Exchange_Name,"boot.haha","你好,我的小宝贝");

}

SpringAMQP对RabbitMQ消息的确认_rabbitmq_03


你看接收到了。

SpringAMQP对RabbitMQ消息的确认_java_04

SpringAMQP对RabbitMQ消息的确认_rabbitmq_05

发送者回执

回执的方法怎么写呢?

这个回执是相对于队列的。当消息发送给Exchange后,Exchange路由到Queue失败后才会执行ReturnCallBack。

来看具体的方法

@Test
public void testReturn()
{
// 设置交换机处理消息的模式
template.setMandatory(true);//设置为true交换机会将路由到队列失败的消息再返回给发送者
template.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
@Override
public void returnedMessage(ReturnedMessage returnedMessage) {
System.out.println("消息对象:"+returnedMessage.getMessage());
System.out.println("错误码:"+returnedMessage.getReplyCode());
System.out.println("错误信息:"+returnedMessage.getReplyText());
System.out.println("交换机:"+returnedMessage.getExchange());
System.out.println("路由键:"+returnedMessage.getRoutingKey());


System.out.println("return执行了...");
}
});
template.convertAndSend(RabbitConfig.Exchange_Name,"boot.haha","hi");
}

// returnedMessage.getMessage() 消息对象
// returnedMessage.getReplyCode() 错误码
// returnedMessage.getReplyText() 错误信息
// returnedMessage.getExchange() 交换机
// returnedMessage.getRoutingKey() 路由键

如果正常执行后,是不会输出信息的。

SpringAMQP对RabbitMQ消息的确认_发送消息_06

SpringAMQP对RabbitMQ消息的确认_rabbitmq_07


这样也接收到了,我们验证一下失败的情况。

这样的返回发生在交换机到队列的传输,所以我们设置一个不存在的队列。

随便来一个错误的。

SpringAMQP对RabbitMQ消息的确认_错误信息_08


但是你这样做的话,其实还是可以找到,因为我们之前做了配置中,队列会自动创建。那么我们就不要让它自动创建。

把这里注释到,但是交换机的创建我们不需注释。

SpringAMQP对RabbitMQ消息的确认_java_09


执行!这样这个方法就执行了。其实我们是找交换机找不到队列,所以方法被回调了。

SpringAMQP对RabbitMQ消息的确认_错误信息_10


举报

相关推荐

0 条评论