关于循环接收队列的内容

来源:9-11 利用RabbitMQ实现消息投递削峰填谷(二)

ccLoveStudy

2022-07-11

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);,所以说每次接收都只随机接收其中一条处理并存储吗?直到接收完毕?还是怎样的一个逻辑呢?
谢谢老师解答!

写回答

1回答

神思者

2022-07-11

i++不是给while循环用的,是给外面的i变量用的,记录接收到多少条消息。while循环每执行一次,只接收一条消息。

1
2
神思者
回复
ccLoveStudy
RabbitMQ不能保证严格的收发顺序
2022-07-11
共2条回复

SpringBoot 在线协同办公小程序开发 全栈式项目实战

未来趋势型业务 + 前后端综合技术栈 + 惊艳的细节打磨

1798 学习 · 1915 问题

查看课程