消息回调
消息队列在实际运用中,作为消息的生产者,很多时候我们需要确认消息是否成功发送到了mq中。同时我们还需要知道,假如消息出现异常时的异常情况。为了满足这个业务场景,我们就需要配置消息回调。
开启消息回调
为了保证消息生产者能够收到消息的回调信息,我么需要修改以下配置,只有添加了下面的配置,才能保证添加相关代码后可以收到系统的回复。
spring:
rabbitmq:
# 开启发送确认
publisher-confirms: true
# 开启发送失败退回
publisher-returns: true
目前回调存在ConfirmCallback和ReturnCallback两者。他们的区别在于
- 如果消息没有到exchange,则ConfirmCallback回调,ack=false,
- 如果消息到达exchange,则ConfirmCallback回调,ack=true
- exchange到queue成功,则不回调ReturnCallback
rabbitMQ 消息生产者发送消息的流程
配置消息回调
ConfirmCallback的回调
/**
* 消息发送成功的回调
* 需要开启
* # 开启发送确认
* publisher-confirms: true
* @author daify
* @date 2019-07-22 15:44
**/
@Slf4j
public class RabbitConfirmCallBack
implements RabbitTemplate.ConfirmCallback {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
log.info("消息唯一标识: {}", correlationData);
log.info("确认状态: {}", ack);
log.info("造成原因: {}", cause);
}
}
ReturnCallback的回调
/**
* 发生异常时的消息返回提醒
* 需要开启
* # 开启发送失败退回
* publisher-returns: true
* @author daify
* @date 2019-07-22 15:45
**/
@Slf4j
public class RabbitReturnCallback
implements RabbitTemplate.ReturnCallback {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
log.info("消息主体: {}", message);
log.info("回复编码: {}", replyCode);
log.info("回复内容: {}", replyText);
log.info("交换器: {}", exchange);
log.info("路由键: {}", routingKey);
}
}
将回调配置到模板中
@Configuration
@AllArgsConstructor
public class RabbitInitializingBean implements InitializingBean {
private RabbitTemplate rabbitTemplate;
@Override
public void afterPropertiesSet() throws Exception {
rabbitTemplate.setConfirmCallback(new RabbitConfirmCallBack());
rabbitTemplate.setReturnCallback(new RabbitReturnCallback());
}
}
配置其exchange和queue
我们现在设计这样一种测试场景。这样send3将会触发ReturnCallback,send2的ack应该为false

最低0.47元/天 解锁文章
50万+





