版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Qgwperfect/article/details/84950006
发布确认机制是保证消息可靠性的第一步,发布确认保证我们知道消息是否成功到达队列中,返回ack则代表成功,nack则 代表失败。使用这个特性,我们需要设置RabbitTemplate的mandatory属性
rabbitTemplate.setMandatory(true);
以及ConnectionFactory的publisherConfirms属性
connectionFactory.setPublisherConfirms(true);
这时我们可以在RabbitTemplate上设置setReturnCallback监听来接收MQ服务器返回的状态信息
rabbitTemplate.setConfirmCallback(confirmCallback);
对于消息的确认,我们只需要设置RabbitTemplate.ConfirmCallback的回调方法
ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if(!ack){
logger.info("打印异常处理....");
}
}
};
我们每次发送send请求时,都会执行相应的ack,其中correlationData是生产者在发送数据时可以携带的相关信息,比如消息唯 一属性
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
RabbitTemplate只允许设置一个callback方法,你可以将RabbitTemplate的bean设为单例然后设置回调,但是这样有个缺点是使 用RabbitTemplate的地方都会执行这个回调,如果直接在别的地方设置,会报如下错误
only one ConfirmCallback is supported by each RabbitTemplate
可以通过将RabbitTemplate的作用域设为@Scope,每次bean都是新的,来解决这个问题
@Bean
@Scope("prototype")
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMandatory(true);
template.setMessageConverter(new SerializerMessageConverter());
return template;
}