SpringBoot RabbitMq 消息投递手动签收 Only one ConfirmCallback is supported by each RabbitTemplate

22 篇文章 0 订阅
2 篇文章 0 订阅

异常信息出现

在工作实际开发中,用到了队列信息,为了消息的可靠性投递,我使用到了手动签收的方式
,开始只有一个地方使用到了,客户调用接口,有一个地方需要用到异步回调,由于中间件的异步特效,我就用队列来做,
开始这一块一点问题没有,客户还在正常使用,后面由于一个其他的需求,也需要使用到了队列,后面也加上了这种手动签收的方式来做,
在本地测试的时候也没啥问题,由于以前的代码没改 所以就没测那一块的功能 。 但是推到线上客户使用的时候,其中一个队列正常签收,
但是当有客户来用第二个队列的时候,就会报上面这个异常信息。

异常信息解析

从异常信息字面意思来看,就是说每个RabbitTemplate对象只支持一个ConfirmCallback手动签收方式的回调,然后我谷歌在文档上面找到一个方法,
这个是RabbitTemplate中setConfirmCallback方法的代码,

image.png

public static void state(boolean expression, String message) {
    if (!expression) {
        throw new IllegalStateException(message);
    }
}

从代码中解析我们可以知道,当前RabbitTemplate.confiirmCallback为null,或者传过来的回调对象就是当前的这个confiirmCallback的时候
就不会报这个异常信息,否则就会报异常信息

问题的解决

由于springBean默认都是单例的,这个RabbitTemplate也不例外,既然每个RabbitTemplate对象只支持一个回调,那我就在该Bean放入spring容器把该RabbitTemplate
设置为原型的(也就是@Scope=“prototype”),具体代码如下

@Bean
@Scope("prototype")
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
    RabbitTemplate template = new RabbitTemplate(connectionFactory);
    template.setMandatory(true);
    template.setMessageConverter(new SerializerMessageConverter());
    return template;
}

修改完以后 再次测试,问题解决啦。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值