RabbitMq在发布/订阅模式下:不声明消费者,returnCallback回调未触发情况下,消息未堆积在队列中
1.发布/订阅模式下:不声明消费者,confirmCallback回调正常,returnCallback回调也没触发,若是发送大量消息看得到rabbitmq后台Message rates的deliver / get 指标中有大量数据飘过,但是Messages各指标一直都是0。
2.简单队列模型下不声明消费者的情况下,发送消息,消息正常存储在队列中。
@Configuration
public class TopicConfig {
/**
* 声明交换机
* @return Topic类型交换机
*/
@Bean
public TopicExchange topicExchange(){
return new TopicExchange("change.topic");
}
/**
* 第1个队列
*/
@Bean
public Queue topicQueue(){
return new Queue("topic.queue");
}
/**
* 绑定队列和交换机
*/
@Bean
public Binding bindingTopicQueue(Queue topicQueue, TopicExchange topicExchange){
return BindingBuilder.bind(topicQueue).to(topicExchange).with("#.id");
}
}
@Test
public void testMessageConfirm(){
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
/**
* @param b 代表交换机是否成功收到了消息,true代表成功,false代表失败
* @param s 代表失败的原因
*/
@Override
public void confirm(CorrelationData correlationData, boolean b, String s) {
System.out.println(b);
// System.out.println("confirm 方法被执行了");
if(b){
//接收成功
System.out.println("消息成功接收");
}else {
System.out.println("消息接受失败,"+s);
}
}
});
/**
* 这个回执是相对于队列的。当消息发送给Exchange后,Exchange路由到Queue失败后才会执行ReturnCallBack。
*/
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println("消息对象:"+message);
System.out.println("错误码:"+replyCode);
System.out.println("错误信息:"+replyText);
System.out.println("交换机:"+exchange);
System.out.println("路由键:"+routingKey);
System.out.println("return执行了...");
}
});
//发送一条消息
for (int i = 0; i < 100; i++) {
//以下执行,上述ReturnCallback未触发,但是消息未堆积在队列中。
rabbitTemplate.convertAndSend("change.topic","user.id","hello,_"+i);
//以下执行,消息正常存储在指定队列中
rabbitTemplate.convertAndSend("simple.queue","hello,_"+i);
}
}
实在不太清楚第一个情况是为什么?若哪位大佬清楚的,希望有后续解答,多谢。