ConfirmCallback Cause:
- clean channel shutdown; protocol method: #method<channel.close>(reply-code=200, reply-text=OK, class-id=0, method-id=0)
代码:
@RunWith(SpringRunner.class)
@ContextConfiguration(locations = "classpath:spring_rabbitmq_producer.xml")
public class RabbitMQConfirm {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testRabbitMQConfirm() throws InterruptedException {
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (ack) {
System.out.println("收到:" + cause);
} else {
System.out.println("没有收到:" + cause);
}
}
});
rabbitTemplate.convertAndSend("test_exchange_confirm", "confirm1", "测试信息");
}
}
原因:
- 消息发送到Broke后,触发回调函数 ConfirmCallback,触发函数这一步是异步运行的,这就有可能出现这种情况:testRabbitMQConfirm()方法运行结束后,回调函数还没有结束,那么,但是由于测试方法结束了,那么和RabbitMQ相关的资源被关闭,回调函数在运行过程中出现异常,所以ack被设置成了false,就出现了信息被保存到了队列,但是回调函数的ack参数缺少false的情况。
解决方法:
rabbitTemplate.convertAndSend("test_exchange_confirm", "confirm1", "测试信息");
Thread.sleep(1000);
|