使用 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);