请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于循环接收队列的内容

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

正在回答 回答被采纳积分+3

1回答

神思者 2022-07-11 11:51:52

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

1 回复 有任何疑惑可以回复我~
  • 提问者 ccLoveStudy #1
    好的,老师,那其实就和我上面说的一样啦:i只是一个记录
    然后那个循环接收消息。就是每次接收一条,这个接收消息有什么内在的逻辑吗,比如接收的顺序是如何定义的呢?
    回复 有任何疑惑可以回复我~ 2022-07-11 11:54:23
  • 神思者 回复 提问者 ccLoveStudy #2
    RabbitMQ不能保证严格的收发顺序
    回复 有任何疑惑可以回复我~ 2022-07-11 13:30:35
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信