SpringAMQP对RabbitMQ消息的确认
- 发送者确认
- 发送者回执
此文的案例基础在上文基础上改造。上文SpringBoot整合RabbitMQ
本篇主要实现一个对生产者发送消息的确认。也就是当我们的生产者发送消息后,消费者这里是否有正确的接收等等,以及对于消息的反馈。
简单的说就是一个对消息的处理方案。
下面我们介绍两个方案。
发送者确认
发送者确认就是publisher-confirm,这个方案主要在交换机这里进行处理。
具体的处理逻辑呢,直接就开始用代码去演示好了。
首先我们需要开启这个发送者确认,我们需要在yml文件中配置
代码语言:javascript复制 publisher-confirm-type: correlated #开启确认模式
然后我们在测试类里面这样去写,写这样的一个测试方法
代码语言:javascript复制 /**
* 在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","你好,我的小宝贝");
}
/** * * @param correlationData convertAndSend相关的配置信息,该方法有重载。所以会有一些不同参数 * @param b 代表交换机是否成功收到了消息,true代表成功,false代表失败 * @param s 代表失败的原因 */ 这里的参数b,这里老师讲的是当成功的时候会返回true,但是我这里发送失败会返回true,发送成功会返回false,已经验证过了。s参数是错误信息。 这里的成功与失败是相对于交换机的需要注意
你看接收到了。
发送者回执
回执的方法怎么写呢?
这个回执是相对于队列的。当消息发送给Exchange后,Exchange路由到Queue失败后才会执行ReturnCallBack。
来看具体的方法
代码语言:javascript复制@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() 路由键
如果正常执行后,是不会输出信息的。
这样也接收到了,我们验证一下失败的情况。
这样的返回发生在交换机到队列的传输,所以我们设置一个不存在的队列。
随便来一个错误的。
但是你这样做的话,其实还是可以找到,因为我们之前做了配置中,队列会自动创建。那么我们就不要让它自动创建。
把这里注释到,但是交换机的创建我们不需注释。
执行!这样这个方法就执行了。其实我们是找交换机找不到队列,所以方法被回调了。