Only one ConfirmCallback is supported by each RabbitTemplate

本文详细介绍了RabbitMQ的发布确认机制,包括如何设置RabbitTemplate和ConnectionFactory的属性来确保消息可靠性,以及如何通过设置回调方法来接收MQ服务器的状态信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       发布确认机制是保证消息可靠性的第一步,发布确认保证我们知道消息是否成功到达队列中,返回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;
}

 

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值