while (true) {
//创建响应接收数据,禁止自动发送Ack应答
GetResponse response = channel.basicGet(topic, false); //b:false,不自动返回ack应答
if (response != null) {
AMQP.BasicProperties properties = response.getProps(); //拿到绑定数据
Map<String, Object> header = properties.getHeaders(); //获取附加属性对象
String messageId = header.get("messageId").toString();
byte[] body = response.getBody();//获取消息正文,为byte模式
String message = new String(body); //把byte模式改为String模式
log.debug("从RabbitMQ接收的消息:" + message);
//往ref集合存储数据
MessageRefEntity entity = new MessageRefEntity();
entity.setMessageId(messageId);
entity.setReceiverId(Integer.parseInt(topic));
entity.setReadFlag(false); //消息设为未读
entity.setLastFlag(true); //消息设为最新消息
messageService.insertRef(entity); //把消息存储在MongoDB中
//数据保存到MongoDB后,才发送Ack应答,让Topic删除这条消息
long deliveryTag = response.getEnvelope().getDeliveryTag();
channel.basicAck(deliveryTag, false);
i++;
} else {
break; //接收不到消息,则退出死循环
}
}
老师,您在这里使用的while(true),然后,终止用的break,但是接收消息使用的代码是GetResponse response = channel.basicGet(topic, false);,这行代码的话,应该是接收到其中的一条消息吧,因为没有涉及到循环处理消息,然后最后那个i++,感觉也没有什么实质意义,老师,我这段视频反复看了好几次,您在视频里只是说,当没有消息的时候,就终止。
那么,假如现在有五条消息,用代码GetResponse response = channel.basicGet(topic, false);这五条消息会在while这句循环中,依次读取并存储,但是每次接收消息都用的GetResponse response = channel.basicGet(topic, false);,所以说每次接收都只随机接收其中一条处理并存储吗?直到接收完毕?还是怎样的一个逻辑呢?
谢谢老师解答!