RabbitTemplate回调出错

使用 RabbitTemplate 回调时出现错误,


java.lang.IllegalStateException: Only one ConfirmCallback is supported by each RabbitTemplate
    at org.springframework.util.Assert.state(Assert.java:73)
    at org.springframework.amqp.rabbit.core.RabbitTemplate.setConfirmCallback(RabbitTemplate.java:447)
    at com.itheima.pinda.goods.service.impl.ShippingServiceImpl.failMsgToRabbitmq(ShippingServiceImpl.java:676)
    at com.itheima.pinda.goods.service.impl.ShippingServiceImpl.submitToWMS(ShippingServiceImpl.java:661)
    at com.itheima.pinda.goods.service.impl.ShippingServiceImpl.submitToWMS(ShippingServiceImpl.java:543)
    at com.itheima.pinda.goods.service.impl.ShippingServiceImpl$$FastClassBySpringCGLIB$$a7f9348c.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685)
    at com.itheima.pinda.goods.service.impl.ShippingServiceImpl$$EnhancerBySpringCGLIB$$26aaa855.submitToWMS(<generated>)
    at com.itheima.pinda.goods.controller.ShippingController.submitToWMS(ShippingController.java:128)

将单例改成多例模式


 @Bean
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory)
    {
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        //设置Json转换器
        rabbitTemplate.setMessageConverter(jsonMessageConverter());

        return rabbitTemplate;
    }

不起作用,然后 添加

 @Bean
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE,**proxyMode = ScopedProxyMode.TARGET_CLASS)**
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory)
    {
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
       
        //设置Json转换器
        rabbitTemplate.setMessageConverter(jsonMessageConverter());

        return rabbitTemplate;
    }

发现不报错了,但是回调不执行了,


  rabbitTemplate.setConfirmCallback((correlationData, b, s) -> {
                        if (b){
                            log.info("failMsgToRabbitmq消息成功发送:key= {} and value= {}",key,result.get(key));
                        }else {
                            log.info("failMsgToRabbitmq消息失败发送:key= {} and value= {},{}", key, result.get(key), s);
                        }
                    });
                    rabbitTemplate.convertAndSend(RabbitMqConfig.DIRECT_EXCHANGE_REMIND, RabbitMqConfig.REMIND_ROUTING_KEY, result);

抓狂,求指点迷津


confirm机制需要设置Mandatory属性,配置了?

在加上 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)之后,打印对象发现还是单例的,每次都一样。也是就是注解并没有生效,然后又上网查了一下,写成@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE,proxyMode = ScopedProxyMode.TARGET_CLASS) 打印对象,多例生效了,但是诡异的是,回调函数不执行了,直接绕开,和没有写一样。

然后我注释掉回调,


```java

   rabbitTemplate.setMandatory(true);
                    System.out.println(rabbitTemplate);
                   /* rabbitTemplate.setReturnCallback((message, i, s, s1, s2) -> {
                        log.info(message.toString());
                        log.info("错误码:{},错误信息:{},交换机:{},路由key:{}",i,s,s1,s2);
                    });*/
                  /*  rabbitTemplate.setConfirmCallback((correlationData, b, s) -> {
                        if (b){
                            log.info("failMsgToRabbitmq消息成功发送:key= {} and value= {}",key,result.get(key));
                        }else {
                            log.info("failMsgToRabbitmq消息失败发送:key= {} and value= {},{}", key, result.get(key), s);
                        }
                    });*/

                    rabbitTemplate.convertAndSend(RabbitMqConfig.DIRECT_EXCHANGE_REMIND, RabbitMqConfig.REMIND_ROUTING_KEY, result);
                }
            }

在配置里面写回调函数,发现正常了,很奇怪,不知道为什么?


```java
   @Bean
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE,proxyMode = ScopedProxyMode.TARGET_CLASS)
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory)
    {
         RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);

        rabbitTemplate.setConfirmCallback((correlationData, b, s) -> {
            System.out.println("回调执行了");
        });
        //设置Json转换器
        rabbitTemplate.setMessageConverter(jsonMessageConverter());

        return rabbitTemplate;
    }

执行多次都成功了


```java
org.springframework.amqp.rabbit.core.RabbitTemplate@34ebee22
回调执行了
.......

org.springframework.amqp.rabbit.core.RabbitTemplate@645fcfc4
回调执行了



```

private final ApplicationContext applicationContext;
RabbitTemplate template = applicationContext.getBean(RabbitTemplate.class);