java回调函数与return_rabbitmq进阶:回调函数之确认(confirm)模式、回退(return)模式...

一、确认(confirm)模式

运用场景

当生产者发送消息至交换机后的 成功或失败 所处理的业务

废话不多说,直接上代码

开启确认模式

spring:

rabbitmq:

host: localhost

port: 5672

username: guest

password: guest

virtual-host: /

listener:

simple:

acknowledge-mode: manual # 消费者手动确认消息

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

@Test

void contextLoads() {

rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {

/**

* @param correlationData 相关配置信息

* @param ack 交换机是否收到消息

* @param cause 失败的原因

*/

@Override

public void confirm(CorrelationData correlationData, boolean ack, String cause) {

if (ack) {

// TODO 发送成功后的业务逻辑

System.out.println("消息发送成功");

} else {

System.out.println("消息发送失败");

System.out.println("失败原因" + cause);

// TODO 发送失败后的业务处理

}

}

});

rabbitTemplate.convertAndSend("test.topic", "topic.order", "hello mq");

}

测试:

d1010024adc4c89897c47658cefecc15.png

二、回退(return)模式

概念

当生产方发送给交换机后,而交换机传递给队列失败时,才会进行相应的业务处理

yml中

spring:

rabbitmq:

publisher-returns: true # 回退模式

测试:

建立一个消费者,接受消息的参数类型为Integer

/**

* @author dugt1998@163.com

* @date 2020/12/8 14:41

*/

@Component

public class Test {

@RabbitHandler

@RabbitListener(queues = "topic.order")

public void testHandler(Integer integer, Message message, Channel channel) throws IOException {

System.out.println(integer);

channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);

}

}

生产者:发送一个String类型的数据,此时消费者会报错,参数类型不匹配

@Test

void contextLoads() {

rabbitTemplate.setMandatory(true); // 设置强制标志 仅适用于回退模式

rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {

@Override

public void returnedMessage(ReturnedMessage returned) {

System.out.println(returned.getMessage());

}

});

rabbitTemplate.convertAndSend("test.topic", "topic.order", "aa");

}

结果:NumberFormatException类型转换异常

e1a5daffc551932cb6750351e0cfae8f.png

推荐阅读

本文地址:https://blog.csdn.net/weixin_44912855/article/details/110872819

希望与广大网友互动??

点此进行留言吧!


版权声明:本文为weixin_34533343原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。